Quais são as vantagens de declarar argumentos de método __autoreleasing?
ConformeTransição para notas de versão do ARC:
__autoreleasing é usado para denotar argumentos que são passados por referência (id *) e são liberados automaticamente no retorno.
Por exemplo:
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
Mas quais são as vantagens do acima em comparação com:
-(BOOL)performOperationWithError:(NSError * __strong *)error;
Atualizar:
Várias respostas referem-se ao compilador temp var trick faz para lidar com a incompatibilidade entre var e argumento como ovantagem do__autoreleasing
. Eu não vejo porque o compilador não pode fazer o mesmo truque para__strong
argumento. Quero dizer, por um__weak
var e__strong
argumento, compilador pode similarmente fazer isso:
NSError * __weak error;
NSError * __strong tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
if (!OK) {
// Report the error.
}
Compilador sabe-(BOOL)performOperationWithError:(NSError * __strong *)error;
retorna uma referência forte (+1), então ele lida como qualquer outronew
Método da família. Desde atmp
vive no mesmo âmbito queerror
, o compilador pode razoavelmente mantê-lo vivo contanto queerror
então o__weak
referência(error
) é agora suportado por um__strong
referência(tmp
) e não será anulado até o final do escopo.