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:

NSString proprietà:? Copiare o mantenere

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top