110 votes

Quand faut-il utiliser - retainCount ?

Je voudrais savoir en quelle situation avez vous utiliser `` jusqu’ici et finalement les problèmes qui peuvent arriver à l’utiliser.

Merci.

243voto

Dave DeLong Points 156978

Vous ne devez jamais utiliser -retainCount,, car il ne vous dit rien d'utile. La mise en œuvre de la Fondation et AppKit/UIKit cadres est opaque; vous ne savez pas ce qui est retenu, pourquoi c'est conservée, qui est retenue, quand il a été retenu, et ainsi de suite.

Par exemple:

  • Vous pensez que [NSNumber numberWithInt:1] aurait un retainCount de 1. Il n'a pas. C'est 2.
  • Vous pensez que @"Foo" aurait un retainCount de 1. Il n'a pas. C'est 1152921504606846975.
  • Vous pensez que [NSString stringWithString:@"Foo"] aurait un retainCount de 1. Il n'a pas. Encore une fois, c'est 1152921504606846975.

En gros, depuis que tout peut retenir les services d'un objet (et donc d'altérer sa retainCount), et puisque vous n'avez pas la source de la majeure partie du code qui s'exécute une application, d'un objet, retainCount est vide de sens.

Si vous essayez de repérer pourquoi un objet n'est pas libéré, utilisez les Fuites de l'outil dans les Instruments. Si vous essayez de repérer pourquoi un objet a été libéré trop tôt, utilisez les Zombies de l'outil dans les Instruments.

Mais ne pas utiliser -retainCount. Il est vraiment inutile de méthode.

modifier

Veuillez aller à tout le monde http://bugreport.apple.com et demande qu' -retainCount être abandonné. Les plus de gens qui demandent pour le mieux.

edit #2

Comme une mise à jour,[NSNumber numberWithInt:1] a maintenant un retainCount de 9223372036854775807. Si votre code m'attendais à être 2, votre code a rompu.

50voto

Abizern Points 52378

JAMAIS!!!!

Sérieusement. Il suffit de ne pas le faire.

Il suffit de suivre la Gestion de la Mémoire de lignes Directrices et de ne publier que ce que vous alloc, new ou copy (ou tout ce que vous appelé retain à l'origine).

@bbum dit mieux ici DONC, et encore plus en détail sur son blog.

14voto

Jonah Points 11568

Objets de Autoreleased sont un cas où vérifier - retainCount est imprécis et potentiellement trompeur. Le comte de conserver vous ne dit rien sur le nombre de fois - autorelease a été appelée sur un objet et, par conséquent, combien de temps il seront libérés lorsque l’actuelle piscine autorelease draine.

10voto

Egil Points 667

J’ai trouvez-vous retainCounts très utile lorsque vérifié à l’aide des « Instruments » .

À l’aide de l’outil « allocations », assurez-vous que « Compteurs de référence de dossier » sont activés et vous pouvez aller dans n’importe quel objet et voir son histoire retainCount.

En couplant les allocations et les communiqués, vous pouvez obtenir une bonne image de ce qui se passe et souvent résoudre ces cas difficiles où quelque chose n’est pas libéré.

C’a m’a jamais laissé tomber - y compris la recherche de bogues dans les premières versions bêta de l’iOS.

5voto

lxt Points 22990

Jetez un oeil à la documentation d'Apple sur NSObject, il couvre assez bien à votre question: NSObject retainCount

En bref, retainCount est probablement inutile pour vous, sauf si vous avez mis en œuvre votre propre système de comptage de référence (et je peux presque garantir que vous n'aurez pas).

Apple, avec ses propres mots, retainCount est "généralement d'aucune utilité pour le débogage des problèmes de gestion mémoire".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X