234 votes

Quel genre de fuites fait référence automatique comptage Objective-C pas prévenir ou minimiser ?

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 du 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 NSAutoreleasePools plus).

Mais ce que d'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?

261voto

Brad Larson Points 122629

Le principal liées à 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 l' __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 utiliserez 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 comme char*. 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 cas dans la longue durée de son ARC writeup.

En plus de cela, il ya plusieurs d'autres, moins nombreux, mais toujours potentiellement problématiques cas, les spécifications publiées va dans les détails.

Beaucoup de le nouveau comportement, basé sur le maintien des objets aussi longtemps que il ya une forte pointeur, 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.

L'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.

14voto

Stripes Points 1960

ARC ne va pas vous aider avec de la mémoire non-ObjC, par exemple si vous quelque chose, vous devez encore il.

ARC peut se laisser berner par `` si le compilateur ne peut pas comprendre ce que le sélecteur est (le compilateur génère un avertissement là-dessus).

ARC génère également du code qui suit les conventions d’appellation ObjC, ainsi si vous mélangez code ARC et MRC vous pouvez obtenir des résultats surprenants, si le code de la MRC ne fait pas ce que le compilateur pense la promesse de noms.

0voto

FreeAsInBeer Points 9791

Théoriquement, l'ARC devrait prendre en charge 100% de normalement alloués et les objets publiés. En raison de la nouvelle compilateur souvent, vous n'avez même pas besoin d'un autoreleasepool (@autoreleasepool) où vous avez fait avant.

Ils ne mentionnent spécifiquement que si vous conservez ou libéré des objets en se basant sur l'conserver le compte d'autres objets (vraiment déroutant cas que personne ne devrait jamais utiliser) puis le compilateur ne comprends pas comment le résoudre. Quand il se heurte à des problèmes, il va vous demander votre intervention, de manière à en supposant que vos corrections sont bonnes, vous pouvez compter sur l'ARC de code 100% du temps.

0voto

MaddTheSane Points 452

ARC ne gérera pas aussi CoreFoundation types. Vous pouvez « pont » (utilisation `` ) mais seulement si vous allez l’utiliser comme un objet d’Objective-C/Cocoa. Notez que CFBridgingRelease juste décrémente la CoreFoundation conserve nombre par 1 et déplace vers l’ARC de l’Objective-C.

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