76 votes

ARC - Le sens de l' __dangereuse_consignes?

Veulent juste s'assurer que je l'ai eu droit:

  1. Ai-je besoin d' __unsafe_unretain des objets que je ne possède pas?
  2. Si un objet est - __unsafe_unretained Dois-je utiliser assign dans la @property? Est-ce à dire que l'objet n'est pas conservé, et renvoie à l'objet-je céder?
  3. Quand je veux l'utiliser à l'exception des délégués?
  4. Est-ce un ARC chose ou c'était en usage avant?

188voto

Brad Larson Points 122629

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.

4voto

dasblinkenlight Points 264350
  1. Non, vous pouvez également utiliser weak pour les objets que vous ne possédez pas.
  2. Non, vous pouvez également utiliser unsafe_unretained sur la propriété.
  3. Ma compréhension est qu' unsafe_unretained les articles sont exactement comme weak, sans que la sécurité supplémentaire de la compensation quand l'article point à se libère (et les frais généraux qui va avec).
  4. C'est tout à fait un ARC chose.

4voto

Joshua Weinberg Points 22701

__unsafe_unretained est identique à ce que le stockage par défaut d'un objet avant de l'ARC. Avec l'ARC le défaut est __strong ce qui signifie que vous avez une référence à elle jusqu'à ce que votre référence est hors de portée.

1voto

Gerd Points 253

Une autre observation sur l' __dangereuse_consignes: j'ai des plantages de mon application sur l'appareil et PAS sur simulateur avec iVars déclarée __dangereuse_consignes! Oui, c'était un bug dans le code de l'ARC de migration, mais c'était la première fois que j'ai remarqué une différence entre l'appareil et le simulateur.

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