2011-11-02 8 views
17
  1. Si declaro una propiedad fuerte, así:¿Es necesario self.iVar para obtener propiedades fuertes con ARC?

    @property (strong, nonatomic) UIView *iVar; 
    

    Cuando estoy de configurarla, qué importa si lo hago o iVar = ...self.iVar = ...? Parece que con ARC, hacen lo mismo.

  2. Si sólo declarar la variable de instancia (no el @property), por ejemplo, BOOL selected, ¿significa que se infiere que __unsafe_unretained (ya que no hay ninguna propiedad que especifica que sea fuerte), o tengo que especificar explícitamente que?

Parece que puede haber respondido a mis propias preguntas por encima de la hora de responder ARC: How to release static variable?, pero todavía estoy un poco confundido en las preguntas anteriores.

Respuesta

20

Desde una perspectiva de gestión de memoria, utilizando ivar = ... o self.property = ... (nota: no hay tal cosa como self.ivar) son los mismos. Sin embargo, usar ivar = ... no invoca al colocador mientras que self.property = ... sí lo hace. Esto tiene importantes ramificaciones 3, en ningún orden en particular:

  1. Si la propiedad no está marcado nonatomic, entonces el acceso al Ivar subyacente no se llevará a la cerradura y se le rompiendo las implicaciones atomicidad.
  2. Si la propiedad es anulada, ya sea por usted o por una subclase, no se invocará el colocador reemplazado.
  3. No se enviarán notificaciones KVO.

En cuanto a la única declarar Ivar, que tiene la misma semántica de gestión de memoria como la que se declara una variable local. Esto está documentado en el documento section 4.4 of the Objective-C Automatic Reference Counting, pero básicamente, si se trata de un objeto, se deducirá que es __strong.

+0

@kaka: No. Contraejemplo trivial: la asignación de una estructura más grande que una sola palabra es casi seguro que no es atómica independientemente de ARC/MRR. –

Cuestiones relacionadas