2010-03-30 11 views
0

Je rencontre un problème avec une chaîne contenant des caractères codés. Plus précisément, si la chaîne a des caractères codés, elle finit par devenir invalide alors qu'une chaîne "normale" ne le sera pas.La chaîne nsstring codée devient invalide, nsstring "normal" reste

dans le fichier .h:

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

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

dans le fichier .m:

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

    if (self = [super init]) { 

     sourceFolder = folder; 

    } 

    return self; 
} 

Jusqu'à présent, tout semble fonctionner comme prévu. En viewDidLoad je donne les résultats suivants:

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; 

qui utilise la méthode suivante pour encoder la chaîne (si elle a des caractères Je veux encodée):

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

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

    return [result autorelease]; 

} 

Si le résultat que je NSLog, je reçois les valeurs attendues . Si la chaîne a des caractères comme un espace blanc, j'obtiens une chaîne avec un encodage. Si la chaîne n'a pas de caractères à coder, elle me donne simplement la chaîne d'origine.

J'ai un bouton sur la barre de navigation qui commence un processus d'importation d'image en ouvrant une feuille d'action. Une fois que la méthode pour la feuille d'action commence, ma chaîne n'est pas valide - mais seulement si elle contient des caractères codés. Si c'est juste une chaîne "normale", tout va bien et agit comme prévu. Suis-je sur mon encodage? Au début, je pensais que c'était peut-être un problème de mémoire, mais je n'arrive pas à comprendre pourquoi cela affecterait uniquement les chaînes codées.

est ici où la feuille d'action est définie (et la première place que je peux voir la chaîne encodée devient invalide) les déclarations NSLog sont là où il se bloque:

- (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]; 
    } 
} 

Je ne reçois pas d'erreur d'accident va la console. En utilisant des points d'arrêt, j'ai pu voir que le fichier encodedSourceFolder n'est pas valide dans la méthode de feuille d'action.

Répondre

0

Vous devez copier votre passé dans la chaîne de dossier dans votre initWithFolder: requête: méthode comme ceci ou créer une nouvelle chaîne avec:

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

    if (self = [super init]) { 

     sourceFolder = [folder copy]; 

    } 

    return self; 
} 

Sinon, votre chaîne autoreleased ailleurs obtient.

+0

vous pouvez également utiliser « sourcefolder = [[NSString alloc] initWithString :dossier];" – schaechtele

+0

sourceFolder = [copie de dossier]; résulte dans le même comportement. Une chaîne avec des caractères codés devient invalide au même endroit alors qu'une chaîne sans caractères codés reste. – shoreline

+0

sourceFolder = [[NSString alloc] initWithString: dossier]; entraîne également le comportement dans le message original. – shoreline

0

Faire pas utiliser retain pour NSString propriétés. Utilisez copy:

@property (nonatomic, copy) NSString *sourceFolder; 

Il y a plusieurs questions/réponses ici qui expliquent cet autre, comme la réponse de Chris Hanson:

NSString property: copy or retain?

+0

en utilisant copie au lieu de conserver les résultats dans le même comportement; une chaîne sans caractères codés est toujours invalide au même point dans mon application alors qu'une chaîne "normale" n'est pas invalidée et est accessible. – shoreline

+0

Il semble autoreleasing le résultat dans urlEncodeValue: était le problème. Je ne suis pas sûr pourquoi cela affecterait seulement une chaîne avec des caractères codés, puisqu'une chaîne est passée par là malgré tout. Je suppose que je dois faire une copie de la chaîne à ce stade, pas dans le dossier source. – shoreline