2016-05-06 1 views
0
- (void)setToInitialStateMain 
{ 
    [super clearBoard]; 

    if (_data[@"StoneOne"] != nil) { 
     NSDictionary* stoneOne = _data[@"StoneOne"]; 
     NSNumber* c = stoneOne[@"Column"]; 
     NSNumber* r = stoneOne[@"Row"]; 
     NSInteger column = [c intValue]; 
     NSInteger row = [r intValue]; 
     [_boardCol addObject:[NSNumber numberWithInt:column]]; 
     [_boardRow addObject:[NSNumber numberWithInt:row]]; 
    } 
} 

Ainsi, le @"StoneOne", @"Column" et @"Row" clés proviennent d'un fichier plist NSDictionary. Lorsque j'essaie de convertir le NSNumber @"Column" en NSInteger, tout fonctionne bien.Impossible d'ajouter objet NSNumber à NSMutableArray

Maintenant, la ligne [_boardCol addObject:[NSNumber numberWithInt:column]]; est correcte en termes de 'colonne' étant l'entier correct (2). Mais, lors de la configuration d'un point d'arrêt à la fin de l'appel de méthode pour examiner _boardCol (ainsi que _boardRow), les deux variables d'instance NSMutableArray* lisent nil. Pourquoi donc?

+1

vos deux NSMutableArrays ont-ils été initialisés correctement? – zfetters

+0

Comment voulez-vous dire? Je les ai juste écrits en tant que variables d'instance à l'intérieur des accolades de mon fichier Modèle @implementation. Est-ce que ça ne les initialise toujours pas? – Frank

+0

pas besoin d'allouer et de les initialiser quelque part avant qu'ils puissent être utilisés, plus que probablement juste dans la méthode init de votre classe – zfetters

Répondre

0

Toutes les variables d'instance commencent à zéro. Et un appel de méthode à zéro renvoie nul (ou ne fait rien). Vous devez instancier le NSMutableArray vous-même à un moment donné. Cela se fait souvent dans -init, ou un code en ligne vérifier si le Ivar est nul et si oui allouant:

if (self.boardCol == nil) { 
    self.boardCol = [[NSMutableArray alloc] init]; 
} 

Ce qui précède n'est pas une chose sûre à faire si plusieurs threads pourraient être impliqués. Il est souvent plus facile de simplement les créer dans votre méthode -init.

+0

fonctionne bien ... cependant, quand j'essaie d'accéder aux objets d'une méthode différente (qui est appelée par un autre objet dans un autre fichier), je reçois zéro. Des pensées? – Frank

+0

montre comment vous configurez l'accès à cette classe. –

+0

Si votre méthode ci-dessus est appelée en premier, cela fonctionnera ;-) C'est pourquoi la méthode init est la plus simple - cela va les instancier avant que quelqu'un d'autre puisse y accéder. Ou, remplacez la méthode getter pour faire ce qui précède, de sorte que quiconque appelle la méthode getter l'obtiendra paresseusement créé. –