Estou tentando resolver o quebra-cabeça.
__strong
é o padrão para todos os ponteiros de objetos retíveis do Objective-C como NSObject, NSString, etc. É uma referência forte. O ARC o equilibra com um -release
no final do escopo.
__unsafe_unretained
é igual à velha maneira. É usado para um ponteiro fraco sem reter o objeto retentível.
__weak
é semelhante, __unsafe_unretained
exceto que é uma referência fraca de zeragem automática, o que significa que o ponteiro será definido como nulo assim que o objeto referenciado for desalocado. Isso elimina o perigo de ponteiros pendentes e erros EXC_BAD_ACCESS.
Mas para que serve exatamente __autoreleasing
? Estou tendo dificuldade em encontrar exemplos práticos de quando preciso usar este qualificador. Acredito que seja apenas para funções e métodos que esperam um ponteiro-ponteiro, como:
- (BOOL)save:(NSError**);
ou
NSError *error = nil;
[database save:&error];
que sob ARC deve ser declarado desta forma:
- (BOOL)save:(NSError* __autoreleasing *);
Mas isso é muito vago e gostaria de entender o porquê . Os trechos de código que encontro colocam o __autoreleasing entre as duas estrelas, o que me parece estranho. O tipo é NSError**
(um ponteiro para NSError), então por que colocá-lo __autoreleasing
entre as estrelas e não simplesmente na frente delas NSError**
?
Além disso, pode haver outras situações nas quais devo confiar __autoreleasing
.