strong / weak / retain / unsafe_unretained / assign

propiedades para sintetizar la propiedad: retener / asignar

  • retener – se retiene, el valor anterior se libera y se asigna
  • asignar – solo está asignado

propiedades para la propiedad: IOS5 = fuerte / débil IOS4 = retener / no segura_unretenido

  • fuerte (iOS4 = retener) – soy el propietario, no puedes traficar esto antes de apuntar bien con eso = retener

  • débil (iOS4 = inseguro_unretenido) – lo mismo que asignar, no retener o liberar

entonces unsafe_unretained == assign?

@property (nonatomic, assign) NSArray * tmp; 

es igual a ?

 @property (nonatomic, unsafe_unretained) NSArray * tmp; 

y viceversa ?

si es así, ¿cuál prefiere cuando está en iOS4, o por qué existe (unsafe_unretained) si es exactamente lo mismo que asignar?

y un delegado en iOS4 no debería ser conservado o asignado?

si es así, ¿cuál prefiere cuando está en iOS4, o por qué existe (unsafe_unretained) si es exactamente lo mismo que asignar?

deberías usar unsafe_unretained . Desea mostrar al lector de su código que en realidad quería usar débil, pero que esto no era posible porque no está disponible el valor débil en la versión de iOS que desea implementar.

Algún día dejarás de prestar soporte para iOS4. Y luego puedes buscar unsafe_unretained y reemplazar todos con weak . Esto será mucho más fácil que buscar para assign y descubrir si en verdad querías assign o weak

El uso de unsafe_unretained crea un código más legible y comprensible donde las intenciones del desarrollador son más fáciles de ver. Básicamente, la misma razón por la que utilizamos YES lugar de 1 .

Hay algunas clases en Cocoa y Cocoa Touch que todavía no admiten referencias débiles, lo que significa que no puede declarar una propiedad débil o una variable local débil para realizar un seguimiento de ellas. Estas clases incluyen NSTextView, NSFont y NSColorSpace; para obtener la lista completa, consulte Transición a las Notas de versión de ARC.

Si necesita utilizar una referencia débil a una de estas clases, debe usar una referencia insegura. Para una propiedad, esto significa usar el atributo unsafe_unretained:

  @property (unsafe_unretained) NSObject *unsafeProperty; 

Para las variables, debe usar __unsafe_unretained:

 NSObject * __unsafe_unretained unsafeReference; 

Una referencia insegura es similar a una referencia débil ya que no mantiene vivo su objeto relacionado, pero no se establecerá en cero si el objeto de destino está desasignado. Esto significa que se le dejará un puntero colgante a la memoria originalmente ocupada por el objeto desasignado ahora, de ahí el término “inseguro”. Enviar un mensaje a un puntero colgando dará lugar a un locking.

Cortesía: Apple ( https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html ).