2010-12-06 30 views
0

Supposons que vous ayez plusieurs déclarations d'objets de classe et que vous les ajoutiez dans un NSMutableArray, vous modifiez les objets Class et l'objet NSMutableArray. Ce qui se produit?Que se passe-t-il lorsque vous ajoutez une classe dans NSMutableArray et que vous modifiez à la fois cet objet et le tableau?

Exemple de code:

MyClass *item1; 
MyClass *item2; 
NSMutableArray *itemHolder; 

item1 = [[MyClass alloc] init]; 
item2 = [[MyClass alloc] init]; 
itemHolder = [[NSMutableArray alloc] initWithObjects:item1,item2,nil]; 

-(void)someFunction{ 
    [item1 setVarName:@"item1"]; 
    [item2 setVarName:@"item2"]; 
    for(MyClass *items in itemHolder) [items setVarName:@"item"]; 
} 

Je pense que je libère habituellement Item1 et item2 après l'avoir ajouté dans itemHolder mais il ne rompt pas les règles de gestion de la mémoire non? Parce qu'à la fin de dealloc, vous pouvez libérer tout

-(void)dealloc{ 
    [item1 release]; 
    [item2 release]; 
    [itemHolder release]; 
} 

Répondre

1

Lorsque vous ajoutez les objets (item1 et item2) au tableau, le tableau est tout simplement stocker le pointeur. L'objet lui-même n'est pas copié.

Ainsi, lorsque vous setVarName sur Item1 ou setVarName sur le premier élément de la NSArray, les deux actions affectent exactement le même objet (la même instance)

Quant à Mgmt mémoire, lorsque vous ajoutez des éléments à la NSArray , le NSArray (mutable ou non) conservera chacun d'entre eux. Lorsque le tableau est désalloué, il libère chacun d'eux.

Si vous avez d'autres besoins pour conserver chaque élément individuellement, alors vous devriez le faire (comme dans votre exemple). Mais gardez à l'esprit que dans les programmes normaux, vous allez simplement ajouter de nouveaux objets au tableau et les libérer immédiatement puisque le tableau les a conservés.

Mais encore une fois, il est difficile de généraliser sans regarder un exemple spécifique.

+0

Merci pour la réponse. – okysabeni

0

Si vous tentez de publier quelque chose qui a déjà été publié, vous obtiendrez probablement EXC_BAD_ACCESS ou une erreur de segmentation. Essayez de vous assurer que vous ne libérez pas le même objet deux fois.

Si vous relâchez l'objet contenu dans le tableau, puis relâchez Item1 ou item2, vous libérera le même objet deux fois de deux références différentes

Si vous modifiez l'objet de classe alors la version du tableau sera affecté ainsi, et vice versa.