Le Compilateur LLVM 3.0 introduit quatre nouveaux propriété qualificatifs: __strong
, __autoreleasing
, __unsafe_unretained
, et __weak
. Les trois premiers sont disponibles, même à l'extérieur de l'ARC, conformément à la spécification.
Comme Josué l'indique, par défaut, tous les pointeurs sont implicitement __strong
en vertu de l'ARC. Cela signifie que lorsqu'un objet est attribué à un pointeur, il est conservé tant que le pointeur se réfère à elle. C'est très bien pour la plupart des choses, mais il ouvre la possibilité de conserver des cycles, comme je le dis dans ma réponse ici. Par exemple, si vous avez un objet qui contient un autre objet, comme une variable d'instance, mais que le deuxième objet a un lien très fort retour sur le premier comme son délégué, les deux objets ne sera jamais libéré.
C'est pour cette raison que l' __unsafe_unretained
et __weak
qualificatifs existent. Leur usage le plus courant est à l'intention des délégués, où vous définissez une propriété pour que délégué auprès de l' weak
ou unsafe_unretained
d'attribut (assign
est efficacement unsafe_unretained
), puis le match que par le marquage de l'instance respectifs variable __weak
ou __unsafe_unretained
. Cela signifie que le délégué variable d'instance sera toujours le point de revenir sur le premier objet, mais ce ne sera pas parce que l'objet doit être conservé, brisant ainsi le cycle de conserver et permettant à la fois des objets pour être libéré.
Au-delà de délégués, c'est utile à tout casser d'autres conservent des cycles qui peuvent se former dans votre code. Heureusement, les Fuites d'instrument comprend maintenant un des Cycles de vue, ce qui montre conserver les cycles qu'il découvre dans votre application graphique.
Les deux __unsafe_unretained
et __weak
prévenir la rétention d'objets, mais de façon légèrement différente. Pour __weak
, le pointeur vers un objet sera converti nil
sur la désallocation de l'objet qu'il points de, ce qui est très sûr de comportement. Comme son nom l'indique, __unsafe_unretained
continuera de pointage à la mémoire lorsqu'un objet est, même après qu'il a été libéré. Cela peut conduire à des accidents dus à l'accès à celle-désallocation de l'objet.
Pourquoi voudriez-vous jamais les utiliser, __unsafe_unretained
, alors? Malheureusement, __weak
est pris en charge uniquement pour iOS 5.0 et Lion comme cibles de déploiement. Si vous souhaitez cibler retour à iOS 4.0 et Snow Leopard, vous devez utiliser l' __unsafe_unretained
qualificatif, ou utiliser quelque chose comme Mike Ash MAZeroingWeakRef.