Estoy intentando completar el rompecabezas.
__strong
es el valor predeterminado para todos los punteros de objetos retenibles de Objective-C como NSObject, NSString, etc. Es una referencia sólida. ARC lo equilibra con un -release
al final del alcance.
__unsafe_unretained
es igual a la forma antigua. Se usa para un puntero débil sin retener el objeto retenible.
__weak
es como __unsafe_unretained
excepto que es una referencia débil de puesta a cero automática, lo que significa que el puntero se establecerá en cero tan pronto como se desasigne el objeto referenciado. Esto elimina el peligro de punteros colgantes y errores EXC_BAD_ACCESS.
Pero, ¿para qué sirve exactamente __autoreleasing
? Me cuesta encontrar ejemplos prácticos sobre cuándo necesito usar este calificador. Creo que es solo para funciones y métodos que esperan un puntero-puntero como:
- (BOOL)save:(NSError**);
o
NSError *error = nil;
[database save:&error];
que bajo ARC debe declararse de esta manera:
- (BOOL)save:(NSError* __autoreleasing *);
Pero esto es demasiado vago y me gustaría entender completamente por qué . Los fragmentos de código que encuentro colocan el __autoreleasing entre las dos estrellas, lo que me parece extraño. El tipo es NSError**
(un puntero-puntero a NSError), entonces, ¿por qué colocarlo __autoreleasing
entre las estrellas y no simplemente frente a ellas NSError**
?
Además, puede haber otras situaciones en las que deba confiar __autoreleasing
.