Sto cercando di completare il puzzle.
__strong
è l'impostazione predefinita per tutti i puntatori a oggetti conservabili Objective-C come NSObject, NSString, ecc. È un riferimento forte. ARC lo bilancia con una -release
alla fine dell'oscilloscopio.
__unsafe_unretained
è uguale alla vecchia maniera. Viene utilizzato per un puntatore debole senza mantenere l'oggetto conservabile.
__weak
è come __unsafe_unretained
tranne che è un riferimento debole con azzeramento automatico, il che significa che il puntatore verrà impostato su nil non appena l'oggetto di riferimento viene deallocato. Ciò elimina il pericolo di puntatori penzolanti ed errori EXC_BAD_ACCESS.
Ma a cosa serve esattamente __autoreleasing
? Faccio fatica a trovare esempi pratici su quando devo usare questo qualificatore. Credo che sia solo per funzioni e metodi che si aspettano un puntatore puntatore come:
- (BOOL)save:(NSError**);
o
NSError *error = nil;
[database save:&error];
che sotto ARC deve essere dichiarato in questo modo:
- (BOOL)save:(NSError* __autoreleasing *);
Ma questo è troppo vago e mi piacerebbe capire appieno il motivo . I frammenti di codice che trovo collocano il rilascio __autorelease tra le due stelle, il che mi sembra strano. Il tipo è NSError**
(un puntatore-puntatore a NSError), quindi perché posizionarlo __autoreleasing
tra le stelle e non semplicemente davanti a NSError**
?
Inoltre, potrebbero esserci altre situazioni in cui devo fare affidamento __autoreleasing
.