Question

Je suis en cours d'exécution dans un problème avec une chaîne qui contient des caractères codés. Plus précisément, si la chaîne a des caractères codés, il devient finalement invalide alors qu'une chaîne « normale » ne sera pas.

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 que 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 personnages comme un espace blanc, je reçois une chaîne avec le codage. Si la chaîne n'a pas de caractères qui doivent être codés, il me donne juste 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 la méthode de la feuille action commence, ma chaîne est invalide - mais seulement si elle contient des caractères codés. S'il est juste une chaîne « normale », tout va bien et agit comme prévu. Suis-je hors de mon encodage? Au début, je pensais que ce serait peut-être un problème de mémoire, mais je ne peux pas comprendre pourquoi cela aurait une incidence sur les chaînes uniquement codées.

Voici 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'erreurs de collision vont à la console. En utilisant des points d'arrêt, j'ai pu voir que le encodedSourceFolder est invalide dans la méthode de la feuille d'action.

Pas de solution correcte

Autres conseils

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

Dans le cas contraire votre chaîne s'autoreleased ailleurs.

Do pas utilisation retain pour les propriétés de NSString. Utilisez copy:

@property (nonatomic, copy) NSString *sourceFolder;

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

NSString propriété: copier ou conserver

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top