Frage

Ich laufe in ein Problem mit einer Zeichenfolge, die codierten Zeichen enthält. Insbesondere, wenn die Zeichenfolge Zeichen codiert wird es schließlich ungültig, während ein „normaler“ Zeichenfolge nicht.

in der H-Datei:

@interface DirViewController : TTThumbsViewController 
<UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
    NSString *sourceFolder;
    NSString *encodedSourceFolder;
}

@property (nonatomic, retain) NSString *sourceFolder;
@property (nonatomic, retain) NSString *encodedSourceFolder;

in der .m-Datei:

- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {

    if (self = [super init]) {

        sourceFolder = folder;

    }

  return self;
}

Bis jetzt scheint alles wie erwartet zu laufen. In viewDidLoad habe ich folgendes:

sourceFolderCopy = [self urlEncodeValue:(sourceFolder)];

//I also have this button, which I'll refer to later:
UIBarButtonItem *importButton = [[UIBarButtonItem alloc] initWithTitle:@"Import/Export" style:UIBarButtonItemStyleBordered 
                                                                target:self
                                                                action:@selector(importFiles:)];
self.navigationItem.rightBarButtonItem = importButton;

Welche der folgenden Methode verwendet die Zeichenfolge zu kodieren (wenn es hat Zeichen I codiert werden sollen):

- (NSString *)urlEncodeValue:(NSString *)str { 

    NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes (kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8); 

    return [result autorelease]; 

}

Wenn ich NSLog Ergebnis, ich die erwarteten Werte erhalten. Wenn die Zeichenfolge Zeichen wie ein weißer Raum hat, erhalte ich eine Zeichenfolge mit kodiert. Wenn die Zeichenfolge keine Zeichen haben, dass Bedarf codiert werden, es gibt mir nur die ursprüngliche Zeichenfolge.

ich eine Taste auf der Navigationsleiste haben, die durch das Öffnen eines Aktionsblatt ein Bild Importvorgang beginnt. Sobald das Verfahren für das Aktionsblatt beginnt, meine Zeichenfolge ist ungültig - aber nur, wenn es enthält codierte Zeichen. Wenn es nur ein „normal“ String ist, ist alles in Ordnung und wirkt wie erwartet. Bin ich auf meine Codierung aus? Zuerst dachte ich, es könnte ein Speicherproblem, aber ich kann nicht herausfinden, warum das würde nur kodierten Strings beeinflussen.

Hier ist, wo die Aktion Blatt definiert ist (und der erste Platz kann ich die codierte Zeichenfolge ungültig werden sehen) die NSLog Aussagen sind, wo es stürzt ab:

- (IBAction)importFiles:(id)sender {

NSLog(@"logging encodedSF from import files:");
NSLog(@"%@",encodedSourceFolder);//crashes right here
NSLog(@"%@",sourceFolder);

if (shouldNavigate == NO)
{
    NSString *msg = nil;
    msg = @"It is not possible to import or export images while in image selection mode.";

    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"Unable to Import/Export" 
                          message:msg 
                          delegate:self 
                          cancelButtonTitle:@"OK" 
                          otherButtonTitles:nil];
    [alert show];
    [alert release];
    [msg release];
}   

else{
    UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                                  initWithTitle:@"What would you like to do?" 
                                  delegate:self 
                                  cancelButtonTitle:@"Cancel"
                                  destructiveButtonTitle:nil 

                                  otherButtonTitles:@"Import Photos (Picker)", @"Export Photos", nil, nil];

    [actionSheet showInView:self.view];
    [actionSheet release];
  }
}

Ich bekomme keine Crash-Fehler auf der Konsole gehen. Durch die Verwendung von Haltepunkten konnte ich sehen, dass die encodedSourceFolder im Aktionsblatt Methode ungültig sind.

Keine korrekte Lösung

Andere Tipps

Sie sollten übergeben Ordner Zeichenfolge in Ihrem initWithFolder kopieren: Abfrage: Methode wie folgt oder eine neue Zeichenfolge erstellen mit:

- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {

    if (self = [super init]) {

        sourceFolder = [folder copy];

    }

    return self;
}

Ansonsten Zeichenfolge wird Autoreleased an anderer Stelle.

Do nicht Verwendung retain für NSString Eigenschaften. Verwendung copy:

@property (nonatomic, copy) NSString *sourceFolder;

Es gibt mehrere Fragen / Antworten hier, dass diese weiter zu erläutern, wie Chris Hanson Antwort auf:

NSString Eigenschaft: Kopie oder behalten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top