¿Por qué debería preferir el calificador Insafe_Unretined sobre asignación para propiedades de referencia débiles? [duplicar

StackOverflow https://stackoverflow.com/questions/8806831

Pregunta

Posible duplicado:
Uso de ARC, calificador de por vida asignado e unsafe_unretined

¿Cuál es la diferencia entre los dos?

@property(unsafe_unretained) MyClass *delegate;
@property(assign) MyClass *delegate;

Ambos no son referencias débiles de cero, ¿verdad? Entonces, ¿hay alguna razón por la que debería escribir más y más difícil de leer unsafe_unretained en vez de assign?

Nota: Sé que hay weak que es una referencia de cero. Pero es solo iOS> = 5.

¿Fue útil?

Solución

En un accesor de propiedad, sí, esos son iguales. assign las propiedades se mapearán para unsafe_unretained para este caso. Pero considere escribir el IVAR manualmente en lugar de usar la síntesis de IVAR.

@interface Foo
{
   Bar *test;
}
@property(assign) Bar *test;
@end

Este código ahora es incorrecto bajo ARC, mientras que antes del arco no lo era. El atributo predeterminado para todos los objetos OBJ-C es __strong Avanzando. La forma correcta de hacer esto hacia adelante es la siguiente.

@interface Foo
{
   __unsafe_unretained Bar *test;
}
@property(unsafe_unretained) Bar *test;
@end

o con la síntesis de Ivar solo @property(unsafe_unretained) Bar *test

Entonces, realmente es una forma diferente de escribir lo mismo, pero muestra una intención diferente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top