Quand utiliser -retainCount?

J’aimerais savoir dans quelle situation avez-vous utilisé -retainCount jusqu’à présent, et éventuellement les problèmes qui peuvent survenir en l’utilisant.

Merci.

    Vous ne devriez jamais utiliser -retainCount , car il ne vous dit jamais rien d’utile. L’implémentation des frameworks Foundation et AppKit / UIKit est opaque; vous ne savez pas ce qui est retenu, pourquoi il est retenu, qui le conserve, quand il a été retenu, etc.

    Par exemple:

    • On pourrait penser que [NSNumber numberWithInt:1] aurait un retainCount de 1. Ce n’est pas le cas. C’est 2
    • Vous penseriez que @"Foo" aurait une retainCount de retainCount de 1. C’est 1152921504606846975.
    • On pourrait penser que [NSSsortingng ssortingngWithSsortingng:@"Foo"] aurait un retainCount de retainCount de 1. Ce n’est pas le cas. Encore une fois, c’est 1152921504606846975.

    Fondamentalement, comme n’importe quoi peut retenir un object (et donc modifier son retainCount ), et puisque vous n’avez pas la source de la plupart du code qui exécute une application, la valeur retainCount l’object n’a pas de sens.

    Si vous essayez de déterminer pourquoi un object n’est pas désalloué, utilisez l’outil Fuites dans Instruments. Si vous essayez de déterminer pourquoi un object a été libéré trop tôt, utilisez l’outil Zombies dans Instruments.

    Mais n’utilisez pas -retainCount . C’est une méthode vraiment sans valeur.

    modifier

    Veuillez vous rendre sur http://bugreport.apple.com et demander à ce que -retainCount soit obsolète. Plus les gens le demandent, mieux c’est.

    éditer # 2

    En tant que mise à jour, [NSNumber numberWithInt:1] désormais un retainCount de 9223372036854775807. Si votre code s’attendait à ce qu’il soit 2, votre code est maintenant rompu.

    JAMAIS!

    Sérieusement. Juste ne le fais pas.

    Suivez simplement les directives de gestion de la mémoire et ne publiez que ce que vous avez alloc , new ou copy (ou tout ce que vous avez appelé à l’origine).

    @bbum le dit mieux sur SO , et plus en détail sur son blog .

    Les objects auto-libérés sont un cas où la vérification de -retainCount est non informative et potentiellement trompeuse. Le décompte de rétention ne vous dit rien sur le nombre de fois où -autorelease a été appelé sur un object et donc combien de temps il sera libéré lorsque le pool d’autorélimination courant se vide.

    Je trouve que retainCounts est très utile lorsqu’il est vérifié en utilisant «Instruments».

    À l’aide de l’outil «allocations», assurez-vous que «Nombre de références d’enregistrement» est activé et que vous pouvez accéder à n’importe quel object et consulter son historique.

    En associant les allocations et les versions, vous pouvez avoir une bonne idée de ce qui se passe et résoudre souvent les cas difficiles où quelque chose n’est pas publié.

    Cela ne m’a jamais laissé tomber – y compris trouver des bogues dans les premières versions bêta d’iOS.

    Jetez un oeil à la documentation Apple sur NSObject, elle couvre à peu près votre question: NSObject retainCount

    En résumé, keepCount est probablement inutile pour vous, sauf si vous avez implémenté votre propre système de comptage de référence (et je peux presque vous garantir que vous n’en aurez pas).

    Selon les propres mots d’Apple, la propriété retainCount est “généralement sans intérêt pour le débogage des problèmes de gestion de la mémoire”.

    Quels problèmes pouvez-vous obtenir en l’utilisant? Tout ce qu’il fait est de retourner le compte de conservation de l’object. Je ne l’ai jamais appelé et je ne peux penser à aucune raison. Je l’ai ignoré en singletons pour m’assurer qu’ils ne sont pas désalloués.

    Vous ne devriez pas vous soucier de la fuite de mémoire jusqu’à ce que votre application soit opérationnelle et qu’elle fasse quelque chose d’utile.

    Une fois que c’est fait, lancez Instruments et utilisez l’application et voyez si des memory leaks se produisent réellement. Dans la plupart des cas, vous avez créé vous-même un object (vous en êtes donc propriétaire) et vous avez oublié de le libérer une fois terminé.

    N’essayez pas d’optimiser votre code pendant que vous l’écrivez, vos suppositions quant aux memory leaks ou aux délais trop longs sont souvent erronées lorsque vous utilisez réellement l’application.

    Essayez d’écrire du code correct, par exemple si vous créez un object en utilisant alloc et autres, puis assurez-vous de le libérer correctement.

    Bien sûr, vous ne devriez jamais utiliser la méthode retainCount dans votre code, car la signification de sa valeur dépend du nombre d’autoreleases qui ont été appliquées à l’object et que vous ne pouvez pas prédire. Cependant, il est très utile pour le débogage – en particulier lorsque vous recherchez des memory leaks dans le code qui appelle des méthodes d’objects Appkit en dehors de la boucle d’événement principale – et qu’il ne doit pas être déconseillé.

    Dans votre effort pour faire valoir votre sharepoint vue, vous avez sérieusement exagéré le caractère impénétrable de la valeur. Il est vrai que ce n’est pas toujours un compte de référence. Certaines valeurs spéciales sont utilisées pour les indicateurs, par exemple pour indiquer qu’un object ne doit jamais être désalloué. Un nombre comme 1152921504606846975 semble très mystérieux jusqu’à ce que vous l’écriviez en hexadécimal et obtenez 0xfffffffffffffff. Et 9223372036854775807 est 0x7fffffffffffffff en hexadécimal. Et il n’est pas vraiment surprenant que quelqu’un choisisse d’utiliser des valeurs comme celles-ci, car il faudrait près de 3000 ans pour obtenir un keepCount aussi élevé que le plus grand nombre, en supposant que vous avez augmenté le maintien de 100 000 000 fois par seconde.

    Vous ne devriez jamais l’utiliser dans votre code, mais cela pourrait certainement aider lors du débogage

    N’utilisez jamais le fichier -retainCount dans votre code. Cependant, si vous utilisez, vous ne verrez jamais qu’il retourne zéro. Pensez à pourquoi. 🙂

    Les exemples utilisés dans le post de Dave sont NSNumber et NSSsortingngs … donc, si vous utilisez d’autres classes, telles que les UIViews, je suis sûr que vous obtiendrez la bonne réponse (le nombre de réservations dépend de l’implémentation et est prévisible).