¿Por qué debería preferir el calificador Insafe_Unretined sobre asignación para propiedades de referencia débiles? [duplicar
-
26-10-2019 - |
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.
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.