NSString codificato non è più valido, “normali” resti NSString
Domanda
Io corro in un problema con una stringa che contiene caratteri codificati. In particolare, se la stringa è codificata caratteri alla fine diventa valida, mentre una stringa "normale" non sarà.
nel file h:
@interface DirViewController : TTThumbsViewController
<UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
NSString *sourceFolder;
NSString *encodedSourceFolder;
}
@property (nonatomic, retain) NSString *sourceFolder;
@property (nonatomic, retain) NSString *encodedSourceFolder;
nel file .m:
- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {
if (self = [super init]) {
sourceFolder = folder;
}
return self;
}
Fino ad ora tutto sembra funzionare come previsto. In viewDidLoad ho il seguente:
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;
che utilizza il seguente metodo per codificare la stringa (se ha caratteri voglio codificato):
- (NSString *)urlEncodeValue:(NSString *)str {
NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes (kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}
Se il risultato mi NSLog, mi vengono i valori attesi. Se la stringa ha personaggi come uno spazio bianco, ottengo una stringa con codifica. Se la stringa non ha caratteri che devono essere codificati, appena mi dà la stringa originale.
Ho un pulsante sulla barra di navigazione, che inizia un processo di importazione di immagini con l'apertura di un foglio di azione. Una volta che il metodo per il foglio di inizio di azione, la mia stringa non è valido - ma solo se contiene caratteri codificati. Se si tratta solo di una stringa "normale", tutto va bene e agisce come previsto. Sono fuori sul mio codifica? In un primo momento ho pensato che potrebbe essere un problema di memoria, ma non riesco a capire perché questo sarebbe influenzare le stringhe solo codificati.
Ecco dove il foglio di azione è definito (e il primo posto che può vedere la stringa codificata diventare non valido) le dichiarazioni NSLog sono dove si blocca:
- (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];
}
}
Non ottengo errori di crash che vanno alla console. Utilizzando i punti di interruzione sono stato in grado di vedere che l'encodedSourceFolder non è valida nel metodo foglio di azione.
Nessuna soluzione corretta
Altri suggerimenti
Si dovrebbe copiare il passato nella stringa di cartella nel initWithFolder: query: metodo come questo o creare una nuova stringa con:
- (id)initWithFolder:(NSString*)folder query:(NSDictionary*)query {
if (self = [super init]) {
sourceFolder = [folder copy];
}
return self;
}
In caso contrario, la stringa viene autoreleased altrove.
Do non uso retain
per le proprietà NSString
. Uso copy
:
@property (nonatomic, copy) NSString *sourceFolder;
Ci sono diverse domande / risposte qui che spiegano questo ulteriore, come ad esempio la risposta di Chris Hanson a: