33 votes

Comment savoir si je dois conserver ou céder un bien ?

Existe-t-il de bonnes règles pour savoir quand je dois utiliser la fonction "conserver" et quand l'assigner ?

53voto

Marc Charbonneau Points 30464

Assign est pour les valeurs primitives comme BOOL, NSInteger ou double. Pour les objets, utilisez retain ou copy, selon que vous souhaitez conserver une référence à l'objet original ou en faire une copie.

La seule exception courante est celle des références faibles, où vous souhaitez conserver un pointeur vers un objet mais ne pouvez pas le conserver à cause des cycles de référence. Un exemple de ceci est le modèle de délégué, où un objet (par exemple une vue de table) garde un pointeur vers son délégué. Puisque l'objet délégué conserve la vue de la table, si la vue de la table conserve le délégué, aucun des deux ne sera jamais libéré. Dans ce cas, on utilise plutôt une référence faible. Dans cette situation, vous utiliseriez assign lorsque vous créez votre propriété.

4voto

Martin Gordon Points 19587

Je pense que lorsqu'on travaille avec des objets, on utilise presque toujours retain au lieu d'assign et lorsqu'on travaille avec des types primitifs, des structures, etc., on utilise assign (puisqu'on ne peut pas retenir des non-objets). C'est parce que vous voulez que l'objet avec la propriété décide quand il en a fini avec l'objet, et pas quelque chose d'autre. Le Guide de gestion de la mémoire d'Apple le précise :

Il y a des fois où vous ne voulez pas un objet reçu soit éliminé ; par par exemple, vous pouvez avoir besoin de mettre en cache l'objet dans une variable d'instance. Dans ce cas, Dans ce cas, vous êtes le seul à savoir quand l'objet objet n'est plus nécessaire, vous devez donc devez pouvoir vous assurer que l'objet l'objet ne soit pas éliminé alors que vous l'utilisez encore. Vous faites cela avec un retain, qui reste l'effet d'un autorelease en attente (ou préempte un message de release ou d'autorelease ultérieur). En retenant un objet, vous vous vous assurez qu'il ne sera pas désalloué jusqu'à ce que vous en ayez fini avec lui.

Pour une discussion sur l'utilisation de la copie ou de la conservation, voir cette question SO .

4voto

Edgar Points 76

Je sais que c'est une vieille question, mais j'ai trouvé ces directives du uber le gourou Matt Gallagher, super utile : http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html . Dans mon cas, j'ai eu un "enfer de retenue" de ma propre fabrication pour avoir une dur référence à un objet parent.

0voto

pgb Points 17316

Si vous avez l'intention de conserver l'objet et de l'utiliser, utilisez le terme "conserver". Sinon, il risque d'être libéré et vous vous retrouverez avec des erreurs dans votre code.

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