Existe-t-il de bonnes règles pour savoir quand je dois utiliser la fonction "conserver" et quand l'assigner ?
Réponses
Trop de publicités?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é.
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 .
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.