Codierter NSString wird ungültig, „normal“ NSString bleibt
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: