2010-07-29 3 views
0

Donc j'ai un uiviewcontroller. Il a une propriété d'un NSMutableArray avec un nonatomic, conserve la propriété synthétisée.NSDictionary perdre son contenu (exc un mauvais accès)

Dans viewDidLoad, je l'initie avec ce qui suit et ajoute également un bouton à la barre de navigation.

test = [NSDictionary dictionaryWithObjectsAndKeys: 
     [[SearchField alloc] initWithName:@"Subject" :Text], kSubjectKey, 
     [[SearchField alloc] initWithName:@"Source publication" :Text], kSourceKey, 
     [[SearchField alloc] initWithName:@"Keyword" :Text], kKeywordKey, 
     [[SearchField alloc] initWithName:@"Author" :Text], kAuthorKey, 
     [[SearchField alloc] initWithName:@"Color" :Bool], kColorKey, 
     nil ]; 

NSLog([NSString stringWithFormat:@"lol %d", [test count]]); 

Le premier journal, lors de l'exécution du débogueur s'exécute correctement. Cependant, j'ai attaché le code suivant au bouton:

-(void)search:(id)sender{ 

    NSLog([NSString stringWithFormat:@"lol %d", [test count]]); 

Lorsque ce code exécute la ligne de journal se bloque avec un accès mauvais exc. Rien ne se passe au NSDictionary entre viewDidLoad et le bouton, alors pourquoi cela se produit-il? Et plus important encore, comment puis-je le réparer? :)

Vive

Modifier Je pensais que c'était ma classe Searchfield faisait des choses, alors je les ai remplacées par des chaînes simples, le problème se produit encore.

+0

NSLog (@ "lol% d", [nombre de tests]); Je ne suis pas sûr que cela va résoudre votre erreur, mais vous n'avez pas besoin de créer un objet string ici – lukya

+0

Merci! J'ai créé des objets string tout le temps, inutilement :) – qui

+0

Aussi merci pour toutes les réponses, je l'ai réparé sans problème et j'ai eu une meilleure compréhension. – qui

Répondre

4

Vous accédez directement la variable membre - vous devez passer par l'accesseur - à savoir:

self.test = [NSDictionary dictionaryWithObje ... 

Cela fera que votre objet conserve le dictionnaire.

+0

Pour plus de clarté, j'ajouterai simplement que ce conseil ne s'applique pas à ARC. Si vous utilisez ARC et que l'ivar est synthétisé, le compilateur fera la retenue pour vous même si vous n'utilisez pas 'self.'. (Basé sur plusieurs réponses SO que j'ai trouvées aujourd'hui.) – Nestor

1

Le dictionnaire que vous créez est auto-libéré. Vous utilisez une méthode pratique (dictionaryWithObjectsAndKeys:) qui renvoie un nouvel objet auto-libéré. L'objet auto-libéré est libéré (et désalloué) quelque temps après sa création, ce qui explique pourquoi il se bloque plus tard dans le programme.

Vous devez conserver le dictionnaire renvoyé ou créer un nouveau dictionnaire à l'aide de la méthode alloc/init.

De toute façon, vous devez vous rappeler de libérer le dictionnaire lorsque vous avez terminé.

Vous devriez lire les règles de base de gestion de la mémoire et les conventions pour Objective-C.

3
  1. Assurez-vous test est une variable de classe, en le définissant comme une propriété de votre en-tête du contrôleur de vue:

    @property (nonatomic, retain) NSDictionary *test;

  2. de presse dans -dealloc du contrôleur de votre point de vue méthode:

    [test release], test = nil;

  3. Set sa valeur comme suit:

    self.test = [NSDictionary dictionaryWithObjectsAndKeys:...];

  4. accès à ses count propriété comme suit:

    NSLog(@"Count: %u", test.count);

    Ou:

    NSLog(@"Count: %u", [test count]);

    Notez que -count retourne un entier non signé, alors yo Vous devez utiliser %u pour formater sa valeur.

Questions connexes