2010-07-23 7 views
0

umm donc simple question ici:question simple tableau NSMutable

J'ai une instance de NSMutableArray déclaré dans ma tête

NSMutableArray *day19; 

@property (nonatomic, retain) NSMutableArray *day19 

mise en œuvre:

@synthesize day19; 

Dans mon viewDidLoad

self.day19 = [[NSMutableArray alloc] init]; 

Dans le myMethod où je veux ajouter des objets au tableau I:

NSObject *newObject = [[NSObject alloc] init]; 

[day19 addObject:newObject]; 

... Mais quand je vérifie le tableau de rien Jour 19 dedans. Si à l'inverse, j'ajoute newObject à un tempArray dans la portée myMethod et que je place le tableau day19 dans le tempArray, day19 a les objets.

super de base, je sais juste doit être un matin confus ou quelque chose ...

Merci pour toute aide

+0

Lancez un tutoriel Objective-C comme celui-ci: http://www.otierney.net/objective-c.html#nsarray –

+0

J'ai et tous mes tests dans le cas de portée locale fonctionnent correctement ... mais si J'essaie d'ajouter un objet à une variable d'instance de classe ... rien ne colle. – theprojectabot

+0

non-atomique doit être non atomique, et vous avez des crochets incompatibles sur la ligne NSObject. – Kurbz

Répondre

0

Dans mon viewDidLoad

self.day19 = [[NSMutableArray alloc] init]; 

Dans le myMethod où je veux ajouter des objets au tableau I:

NSObject *newObject = [[NSObject alloc] init]; 

[day19 addObject:newObject]; 

... Mais quand je vérifie le tableau de il n'y a rien Jour 19 dedans. Si à l'inverse, j'ajoute newObject à un tempArray dans la portée myMethod et que je place le tableau day19 dans le tempArray, day19 a les objets.

Laisse-moi deviner: Vous avez vérifié le tableau avec le code comme ceci:

NSLog(@"day19 contains %lu objects", [day19 count]); 

Rappelez-vous qu'un message à nil ne fait rien et retourne nil, 0 ou 0.0. C'est pourquoi la sortie a dit 0 objets: Vous n'avez pas de tableau en premier lieu. La raison la plus probable de cela est que viewDidLoad n'a pas encore été appelée, donc vous n'avez pas encore créé le tableau mutable.

Il est également possible que vous ayez un tableau (c'est-à-dire que la vue a été chargée) au moment de l'examen du tableau, mais que vous n'avez pas encore de tableau (la vue n'a pas encore été chargée). temps que vous avez essayé d'ajouter à la matrice, de sorte que votre message addObject: est tombé dans l'oreille d'un sourd.

Envisagez de créer le tableau plus tôt. Vous devriez probablement le créer en init ou initWithCoder:.

Une troisième possibilité est que vous avez examiné le tableau avant même de l'avoir ajouté. Assurez-vous de vous connecter ou de rompre aux deux points, afin que vous sachiez lequel est arrivé en premier. Quel que soit le problème, vous devez également affecter le tableau à la variable d'instance, et non la propriété, ou libérer le tableau avant de l'affecter à la propriété. Sinon, vous conservez trop d'espace dans le tableau, ce qui signifie que vous le ferez probablement plus tard. Vous avez probablement besoin de revoir le Memory Management Programming Guide for Cocoa.

+0

encore une fois avec la bonne réponse. Je l'avais déjà compris mais cela explique à juste titre mon erreur. J'utilisais la méthode pour ajouter des objets à mes tableaux avant de les allouer et les initialiser dans ma méthode ViewDidLoad. Erreur de pâte de copie simple. Merci pour la bonne réponse. – theprojectabot

1

Est-day19 en fait une variable d'instance? Dans l'extrait, il n'est pas clair quand il est déclaré en tant que variable d'instance ou simplement en tant que variable en dehors de la portée de la classe.

1

Quelques choses:

Etes-vous sûr viewDidLoad est le bon endroit pour initialiser votre tableau? Conférer here.

En outre, au moins à partir du code que vous avez posté, il semble que vous êtes bâclé avec vos retenues. Si votre propriété est un retain type, vous ne devriez pas écrire:

self.myProperty = [[Something alloc] init]; // double retain here, bad 

Vous devriez plutôt être en train d'écrire quelque chose comme:

self.myProperty = [[[Something alloc] init] autorelease]; // single, good 

En outre, avec

NSObject *newObject = [[NSObject alloc] init]; 
[day19 addObject:newObject]; 

sauf si vous avez un

[newObject release]; 

bas le brochet, vous avez une fuite de mémoire.

Questions connexes