Ce type de fuites automatique de comptage de référence en Objective-C pas de prévenir ou de réduire?
Dans le Mac et iOS plates-formes, des fuites de mémoire sont souvent causées par des inédits des pointeurs. Traditionnellement, il a toujours été de la plus haute importance pour vérifier vos allocations, les copies et les conserve pour s'assurer que chacune correspond à un message de libération.
La suite d'outils qui vient avec Xcode 4.2 introduit automatique de comptage de référence (ARC) avec la dernière version de la Compilateur LLVM, qui a totalement fait disparaître ce problème en obtenant le compilateur de la mémoire-pour gérer vos choses pour vous. C'est assez cool, et il n'a couper beaucoup de complications inutiles, mondain temps de développement et de prévenir beaucoup de négligence des fuites de mémoire qui sont faciles à fixer avec le bon de conserver/libération de l'équilibre. Même autorelease piscines doivent être gérés différemment lorsque vous activez l'ARC pour votre Mac et iOS (comme vous ne devrait pas affecter votre propre NSAutoreleasePool
s plus).
Mais ce autres fuites de mémoire est-il pas prévenir que je dois encore faire attention?
Comme un bonus, quelles sont les différences entre l'ARC sur Mac OS X et iOS, et la collecte des ordures sur Mac OS X?
Vous devez vous connecter pour publier un commentaire.
La primaire liés à la mémoire de problème, vous aurez toujours besoin d'être conscient de est de retenir les cycles. Cela se produit quand un objet a une forte pointeur à l'autre, mais l'objet cible a une forte pointeur vers l'original. Même lorsque toutes les autres références à ces objets sont retirés, ils ne seront toujours tenir l'un l'autre et ne sera pas publié. Cela peut également se produire indirectement, par une chaîne d'objets qui pourraient avoir le dernier de la chaîne de revenir à une version antérieure de l'objet.
C'est pour cette raison que le
__unsafe_unretained
et__weak
propriété qualificatifs existent. L'ancien ne permet pas de conserver n'importe quel objet de points, mais laisse ouverte la possibilité de l'objet en va et il pointant vers mauvais souvenir, alors que ce dernier ne conserve pas l'objet et se place automatiquement à zéro lorsque sa cible est libéré. Des deux,__weak
est généralement préféré sur les plates-formes d'appui.Vous utilisez ces qualificatifs pour des choses comme des délégués, où vous ne voulez pas l'objet à conserver son délégué et potentiellement conduire à un cycle.
Un autre couple d'importants liés à la mémoire préoccupations sont le traitement de Base des objets de la Fondation et de la mémoire allouée à l'aide d'
malloc()
pour les types commechar*
. L'ARC ne peut pas gérer ces types, seul Objectif-C objets, de sorte que vous aurez toujours besoin de traiter avec vous-même. De base les types de base peut être particulièrement délicate, parce que parfois ils ont besoin d'être comblé à travers de correspondance Objective-C objets, et vice versa. Cela signifie que le contrôle doit être transféré en arrière et en avant de l'ARC lors de la transition entre le FC types et Objective-C. Certains mots clés liés à cette transition ont été ajoutées, et Mike Ash a une grande description de divers combler les cas la longue durée de son ARC writeup.En plus de cela, il ya plusieurs d'autres, moins nombreux, mais toujours potentiellement problématiques d'affaires, que le spécifications publiées va dans les détails.
Beaucoup du nouveau comportement, basé sur le maintien des objets aussi longtemps que il ya une forte pointeur vers eux, est très similaire à la collecte des déchets sur le Mac. Cependant, les techniques de bases sont très différentes. Plutôt que d'avoir un garbage collector processus qui s'exécute à intervalles réguliers pour nettoyer des objets n'est plus d'être souligné, ce style de gestion de la mémoire repose sur l'rigide conserver /les règles de diffusion nous avons tous besoin d'obéir en Objective-C.
ARC prend simplement la répétition de la mémoire gestion des tâches, nous avons eu à faire pendant des années et décharge pour le compilateur, donc nous n'avons jamais à vous inquiéter de nouveau. De cette façon, vous n'avez pas l'arrêt de problèmes ou en dents de scie de la mémoire des profils expérimentés sur les ordures collectées plates-formes. J'ai connu les deux dans mes ordures collectées applications Mac, et je suis impatiente de voir comment ils se comportent en vertu de l'ARC.
Pour en savoir plus sur la collecte des ordures vs ARC, voir cette réaction très intéressante par Chris Lattner sur l'Objective-C liste de diffusion, où il énumère les nombreux avantages de l'ARC sur Objective-C 2.0 de collecte des ordures. J'ai couru dans plusieurs des GC questions qu'il décrit.
ARC ne sera pas vous aider avec les non-ObjC de la mémoire, par exemple si vous
malloc()
quelque chose, vous avez encore besoin defree()
il.ARC peut être dupé par
performSelector:
si le compilateur ne peut pas comprendre ce que le sélecteur est (le compilateur génère un avertissement sur que).ARC permettra également de générer le code suivant ObjC conventions de nommage, donc si vous mélangez de l'ARC et de la MRC de code, vous pouvez obtenir des résultats étonnants si la MRC de code ne fait pas ce que le compilateur les noms promesse.
J'ai connu des fuites de mémoire dans mon application en raison de 4 questions:
Heureusement je suis tombé sur le blog suivant et a été en mesure de les corriger: http://www.reigndesign.com/blog/debugging-retain-cycles-in-objective-c-four-likely-culprits/
ARC ne sera également pas gérer CoreFoundation types. Vous pouvez 'pont' entre eux (à l'Aide de
CFBridgingRelease()
), mais uniquement si vous allez l'utiliser comme Objective-C/Cocoa objet. Notez que CFBridgingRelease juste décrémente le CoreFoundation conserver compter par 1 et se déplace à Objective-C de l'ARC.Xcode 9 fournit un excellent outil pour trouver ce genre de questions. Il est appelé: "Mémoire De Débogage Graphique".
En l'utilisant, vous pouvez trouver votre objet de fuite selon le type de classe et vous pouvez voir clairement qui détient une solide référence à elle, en le libérant de là, de résoudre votre problème. Il détecte également les cycles de mémoire.
Voir plus d'informations sur la façon de l'utiliser