Dans l'exemple de code suivant dans le Guide de programmation de données de base, Nsfetchrequest est créé.
avec autorelease tandis que NssorteDescriptor n'est pas créé avec Autorelease. Pourquoi NssorteDescriptor n'a-t-il pas été créé avec Autorelalease? Est-ce une question de préférence?
5 Réponses :
à l'autorelease ou non à l'autorelease p> blockQuote>
que est em> strong> la question. p>
si TIS noble pour que le codeur souffre des élingues et des flèches de la mémoire fuit ou prennent des bras contre une mer de pointeurs défavorisés et en les conservant, finissez-les ... Tis une consommation de manière induite! Aye, il y a le frottement! ... car dans ceux des objets libérés, quels collectes peuvent venir lorsque nous faisons référence à des objets qui ne sont pas là, il doit nous faire une pause. P>
Je ne pouvais pas m'en empêcher. Je vais prendre le représentant frappé. Je regrette rien! P>
Amusant, mais gêne dans la voie de la recherche de la vraie réponse.
La question est la suivante: comment l'utilisation de Dans vos deux exemples, cela ne fait aucune différence. p>
Nsfetchrequest et NssorteDescriptores seront vivants jusqu'à la fin de la méthode, que ce soient libérés ou autorélisé. p>
Si vous créez une instance d'un objet, puis donnez-la à un autre objet (par exemple, un nsarray), il restera vivant, que vous appeliez la libération ou l'autorelease. P> autoréléase code> ou libérer code> affecte la durée de vie d'un objet? p>
Lorsque vous avez une autorelease, vous dites essentiellement: «Je n'ai plus besoin de cela, mais quelqu'un d'autre est libre de le ramasser (avant la drainité du pool de libération automatique)». Lorsque vous relâchez explicitement un objet, vous dites: «Je n'ai plus besoin de cela et à moins que quelqu'un d'autre ait déjà dit autrement (acquis), cela devrait être traité immédiatement." P>
Par conséquent, l'autorelease n'est pas normalement la mauvaise chose à faire. Il est requis em> lorsque vous souhaitez transmettre des objets à l'expéditeur d'un message sans demander à l'expéditeur de prendre soin de la libération de l'objet. P>
C'est l'explication la plus succincte que j'ai lu pour Autorélecease.
Conserver et Autoréleuillet, fonctionnellement em> conserver un objet mais ils ne fusionnent pas em>. Les différences sont que la conservation des comptes ne peut être décrémentée que par un autre objet, tandis que les numérations automatiques sont décrémentées automatiquement lorsque le NSATORLEEASEEPOOL est drainé. Si aucun autre objet n'a conservé l'objet Autorélied au moment où la piscine se draine, elle va du poof. P>
Fondamentalement, vous utilisez AutoRelease lorsque vous souhaitez vous assurer qu'un objet se bloque dans la méthode actuelle et peut être transmis à d'autres objets, mais vous ne voulez pas avoir à suivre sa libération vous-même. p>
Dans votre exemple exemple, AutoRelease est juste une mesure de sécurité. L'objet Nspredicat est publié car son travail est terminé, mais le codeur souhaitait s'assurer que l'objet Nsfetchrequest est suspendu. Vous n'avez pas à utiliser "Autoréleuilly" dans ce cas, mais si vous avez perdu le nombre de vos libérations, le fetchrequest pourrait disparaître. D'autre part, vous ne le voulez pas d'orpheline et de fuites de sorte que vous utilisez Autoréleuillet pour nettoyer lorsque la piscine l'objet est dans les drains. P>
L'utilisation la plus courante de l'autorelease est lorsque vous créez un nombre variable d'objets à chaque fois. Vous ne voulez pas avoir à les suivre pour qu'ils puissent les autoriser et laissez la piscine prendre soin d'eux. (Encore mieux, vous créez une piscine locale et dragez-la dès que vous avez terminé.) P>
Dans la norme Apple API, toute méthode qui crée un nouvel objet sans que les mots clés «init», «nouveau» ou «créer» renvoie un objet AutoReled. p>
EDIT01: à partir des documents Apple P>
Une piscine Autoréleuillet est une instance de
NsautoreleePool qui "contient"
d'autres objets qui ont reçu un
Message automatique de l'autorelease; quand le
La piscine automatique est distribuée
envoie un message de publication à chacun des
ces objets. Un objet peut être mis
dans une piscine Autoréleuillet plusieurs plusieurs
fois et reçoit un message de libération
Pour chaque fois qu'il a été mis dans la
bassin. Ainsi, envoyer une autorelease
Au lieu de libérer à un objet
étend la durée de vie de cet objet à
moins jusqu'à ce que la piscine elle-même soit
libéré (l'objet peut survivre
plus longtemps s'il est conservé dans le
provisoire). P>
blockQuote>
Les comptes de retenue et l'autorelease permettent à tous les deux un objet vivant par le même mécanisme de numération de base (mais séparé). La principale différence est la propriété d'objet envoie la libération. Avec des comptes conservés, son autre objet, mais pour un comptage automatique, c'est la piscine Autoréleuillet. p> - [nsstring initwithstring:] code> n'est pas une autorelease mais - [Nstring StringwithString:] est. Cela provoque des problèmes dans les environnements de collecte non-ordures car stringwithstring: code> renvoie une chaîne qui semble se comporter comme un objet retenu, mais plus tard, elle disparaîtra soudainement apparemment au hasard lorsque la piscine Autoréleuille a été créée dans les drains. p>
Autoréleuillet ne conserve pas un objet.
L'objet de la requête va être retourné à l'appelant, alors que le SortDescriptor est utilisé puis mis au rebut. P>
La justification de l'autorelease est simple. Sans cela, tout objet renvoyé d'une fonction devrait être libéré par l'appelant si elles n'en ont pas besoin. Utilisation de l'autorelease signifie que les fonctions peuvent renvoyer un objet qui si l'appelant ne se soucie pas, ou s'ils vont le regarder mais ne conservent pas une référence à cela, ils peuvent simplement l'utiliser sans ajouter de code supplémentaire pour la libérer. Seulement s'ils gardent une référence ont-ils besoin de le conserver. P>
Il vaut la peine d'être réfléchi à ce que signifie Autorélange signifie. Lorsque vous appelez Autorelalease sur un objet, il ajoute l'objet à une liste et lorsque votre boucle d'application se termine, elle aura la libération appelée. Cela rend l'autorelease exactement équivalente à une libération retardée. P>
Le document Apple sur la gestion de la mémoire est excellent et mérite d'être une lecture attentive. http://developer.apple.com/iphone/ Bibliothèque / Documentation / Cocoa / Conceptuel / MemoryMGMT / MemoryMGMT.HTML P>