2010-08-08 6 views
1

Im nouveau à obj-c et ont du mal à comprendre la fonction autorelease. quelqu'un pourrait-il m'expliquer quand je devrais l'utiliser? et comment est-ce différent de la libération. dois-je également réinitialiser le pool autorelease? Comment? et quand?objectif-c autorelease

+0

duplication possible de [Comprendre le comptage des références avec Cocoa/Objective C] (http://stackoverflow.com/questions/6578/understanding-reference-counting-with-cocoa-objective-c) –

Répondre

6

L'appel autorelease programme un release message à être envoyé à un objet dans un avenir proche en ajoutant l'objet au plus haut NSAutoreleasePool. Lorsqu'un pool reçoit le message drain, il envoie release à tous les objets qui y ont été ajoutés.

autorelease est utilisé dans des situations où une méthode ou une fonction doit abandonner sa propriété d'un objet, mais doit l'empêcher d'être temporairement afin que son appelant puisse faire quelque chose avec elle. Il est également utile dans la création de méthodes «pratiques» qui enveloppent alloc, initWith... et autorelease pour rendre le code qui alloue des objets plus simple.

+0

donc j'ai besoin de drainer NSAutoreleasePool manuellement à droite? ce n'est pas la collecte des ordures? Quand dois-je appeler la méthode de vidange? – Yazzmi

+0

Vous n'avez pas besoin de vider le NSAutoreleasePool principal, il va ramasser les ordures. Cependant, si vous créez votre propre NSAutoreleasePool, vous devez le libérer vous-même. Dans le cas où vous avez du code qui alloue beaucoup d'objets auto-libérés (beaucoup de mémoire), vous pouvez vider le pool pour libérer cette mémoire instantanément quand il n'est plus nécessaire. Si tel est le cas, vous devez configurer un nouveau NSAutoreleasePool pour ce scénario et l'éliminer au lieu de vider le pool principal/d'application. – Merrimack

+0

Ce n'est pas vrai qu'il va ramasser les ordures - l'iPhone n'a pas de ramasse-miettes. Le système crée cependant un pool avant d'envoyer un événement à partir du cycle principal et de le vider après le traitement de l'événement. – rpetrich

1

Lorsque vous envoyez -autorelease à un objet, il est ajouté à une liste (le pool autorelease) et lorsque le pool est libéré ou drainé, chaque objet de la liste reçoit un message -release.

Autorelease n'est rien mais un mécanisme de message retardé.

Questions connexes