2010-09-16 16 views
6

Je fais un jeu iPhone. Je veux libérer tous les objets qui ont été alloués ou conservés. Dans la fonction dealloc, je libère tous ces objets, mais ensuite j'ai réalisé que parfois je finis par relâcher des objets quand ils n'ont pas encore été attribués. Donc j'ai pensé que je dois vérifier si son retainCount est supérieur à zéro ou pas avant de le libérer.Combien de fois puis-je libérer un objet alloué ou conservé?

Ma question est:

-je vérifier que si le retainCount est supérieur à zéro, puis le relâcher?

if([bg retainCount]!=0) 
{ 
    [bg release]; 
} 

, ou

Dois-je libérer autant de fois que son retainCount

while([bg retainCount]!=0) 
{ 
    [bg release]; 
} 

Merci pour votre aide!

+23

Le 'retainCount' de n'importe quel objet est ** aucun de vos affaires **. Il est là comme une aide au débogage, mais rien de plus. Le code de production ne devrait jamais en dépendre. – Sven

+9

BTW - pas que cela rend le code correct - mais, par définition, 'retainCount' ne peut jamais retourner 0 parce que l'objet a déjà été libéré par le temps qu'il se passe ..... – bbum

+0

Aussi, essayez d'utiliser" Build & Analyser "(c'est-à-dire l'analyseur Clang). Cela pourrait vous indiquer où vous allez mal. –

Répondre

77

N'utilisez pas -retainCount.

Le nombre absolu de rétention d'un objet n'a pas de sens.

Vous devez appeler release exactement le même nombre de fois que vous avez provoqué la conservation de l'objet. Pas moins (sauf si vous aimez les fuites) et, certainement, pas plus (sauf si vous aimez les accidents).

Voir le Memory Management Guidelines pour plus de détails.

+10

Vous devriez avoir tatoué quelque part. –

+4

@bbum: rdar: // 8122368 (http://openradar.appspot.com/8122368 pour tous les non-Apple) –

+0

Je n'ai pas encore utilisé retainCount mais je me demandais si je devrais. Merci d'avoir effacé cela :) J'attribue une image de premier plan lorsque le joueur meurt dans la partie. Maintenant, si le joueur termine le niveau sans mourir tout le niveau puis dans le dealloc, comment puis-je vérifier si je devrais libérer le premier plan ou non. Est-ce que j'utilise simplement un drapeau pour vérifier si le foregrounf a été utilisé ou non? – abhinav