2010-09-09 2 views
2

Si je crée une vue, et l'ajouter en tant que sous-vue et ajoute également à un tableau, dois-je libérer deux fois?C (iphone) sur la libération

UIView* cat = [[UIView alloc] initWithFrame:someFrame]; 
    [self.view addSubview:cat]; 
    [self.animals addObject:cat]; 
    [cat release]; 
    [cat release]; 

Il me semble juste bizarre d'avoir 2 déclarations de version, et je n'ai pas vu les gens le faire. Mais le nombre de retenues n'augmente-t-il pas de 2 dans ce cas?

Répondre

8

que vous devriez avoir un release - pour équilibrer le alloc. Ni addSubView: ni addObject: ne donnent à l'appelant la propriété de l'objet, donc l'appelant n'a pas besoin de les équilibrer avec un release. Lire le memory management guide devrait effacer tout cela pour vous.

Il pourrait aider à se rappeler "NARC" - si vous appelez une méthode sur un objet qui inclut le mot "n ew", "un lloc", "r Étain" ou «c opy ", vous devez le libérer. Comme vous pouvez le voir dans votre code ci-dessus, seul alloc correspond à la facture. Puisque vous ne l'avez que narré une fois, vous n'avez besoin de le relâcher qu'une seule fois.

+0

Merci, je m'en souviendrai. – sol

2

Quand le chat est ajouté à self.view, puis le chat self.view est propriétaire, et il est responsable de libérer le chat. C'est la même chose que pour les auto-animaux. Les auto-animaux possèdent le chat. Lorsque self.animals est libéré, il libère tous les objets qu'il possède.

Donc, vous devez libérer le chat seul. Parce que dans votre bloc de code, vous possédez seulement un chat, pas deux.

+0

ok une question de suivi alors - est-ce que self.animals = nil libère le chat? – sol

+0

Je suppose que vos animaux sont une structure de NSArray. Lorsque le tableau des animaux est libéré, tous les objets dans le tableau recevront un message de libération. Ainsi, le chat dans les animaux sera libéré. – AechoLiu

3

En plus de ce que Chuck a écrit:

Il est pas que vous relâchez parceaddSubview: ou addObject:pourrait/ne pourrait pas augmenter le nombre de retenir.

C'est ainsi tout à fait tort de le regarder. Si self.viewretain s votre objet, c'est la responsabilité de self.view de le libérer correctement, et ce n'est pas quelque chose dont vous devriez vous soucier.

C'est parce que vous avez créé l'objet parallocvous devez le publier.

0

Comme vous a été mentionné n'avez pas de libérer deux fois; une fois est tout ce qui est requis. Cependant, vous ne devez pas libérer du tout si vous utilisez autorelease:

UIView* cat = [[[UIView alloc] initWithFrame:someFrame] autorelease]; 
[self.view addSubview:cat]; 
[self.animals addObject:cat]; 

L'objet chat sortira vers la fin du cycle runloop. L'utilisation d'autorelease rendra votre code plus propre et plus apte à faire face aux changements. De plus, vous n'avez pas besoin des auto-qualificatifs à la vue et des animaux, sauf si vous voulez les distinguer des objets de portée locale (ce serait également une mauvaise pratique d'avoir des variables localement définies comme les membres de vos classes).

Questions connexes