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 outronewMé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.

questionAnswers(3)

yourAnswerToTheQuestion