2009-12-01 5 views
51

J'ai déclaré un NSMutableArray *categories dans mon fichier contrôleur .h, et déclaré une propriété pour cela.NSMutableArray addObject ne fonctionne pas

Dans la méthode parser:foundCharacters: du délégué NSXMLParser dans mon dossier .m, j'ai ce code:

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFound) 
    { 
     element = string; 
     [self.categories addObject:element]; 
    } 
} 

Mais quand je passe la souris sur la ligne [self.categories addObject:element] après entrer dans en mode de débogage, XCode me dit la la taille est 0x0, 0 objets. Il y a 3 éléments dans mon fichier XML donc 3 éléments devraient être dans le tableau.

Il me manque quelque chose de vraiment évident et je n'arrive pas à comprendre quoi.

+3

Pour votre future publication: la façon de mettre en forme le code est de sélectionner le bloc de code, et de mettre en retrait tout 4 espaces en utilisant le bouton "code" du formateur en haut de l'éditeur de publication. –

+0

désolé - j'ai copié et collé d'un autre forum, devinez le formatage n'a pas tenu jusqu'à beaucoup! merci – joec

Répondre

140

La partie "0x0" est une adresse mémoire. Plus précisément, "nil", ce qui signifie que votre tableau mutable n'existe pas au moment où il est appelé. Essayez de créer dans votre méthode -init:

categories = [[NSMutableArray alloc] init]; 

Ne pas oublier de le libérer dans votre -dealloc.

+11

Je ne sais pas pourquoi je n'oublie pas de le faire. Merci. – James

+17

(Mise à jour 2012: Si vous utilisez ARC, la partie release/dealloc peut être ignorée.) –

+4

Merci! Il est facile de continuer à oublier que les messages à zéro références d'objets n'échouent pas en Objective-C. – JasonD

6

Initialiser un tableau vide en utilisant

categories = [NSMutableArray array]; 

La méthode de classe de tableau sont autoreleased donc pas besoin de libérer.

+0

Vishu - Votre solution fonctionne, mais je pense que la solution de Joshua Nozzi est meilleure car elle nécessite moins de mémoire. –

+0

Ceci est fonctionnellement équivalent à ma réponse cinq ans et demi mieux, en utilisant simplement la méthode de commodité au lieu de alloc/init. Il n'y a pas de différence dans l'utilisation de la mémoire et le résultat est exactement le même. –

-2
@property (Strong, nonatomic) NSMutableArray * yourArray; 

vous devez utiliser fort.

+0

Cela ne répond pas à la question - le tableau n'est pas initialisé donc il n'existe pas (il en est de même). Aussi, 'strong 'est la valeur par défaut pour les propriétés ObjC 2, mais nous ne savons rien sur la façon dont il est déclaré à partir du code donné; Tout ce que nous savons, c'est qu'il n'existe pas à l'exécution et semble être un ivar d'une classe, donc nous savons seulement que le problème est qu'aucun tableau n'est assigné au moment où la méthode est appelée. Il peut * avoir * été créé au moment de l'initialisation et supprimé ailleurs. Mon point est cette réponse fait beaucoup d'hypothèses et est très vague. Je ne vois pas ce que cela ajoute à la réponse acceptée beaucoup plus ancienne. –

Questions connexes