Jakie są zalety deklarowania argumentów metody __autoreleasing?
Jak naPrzejście do Uwagi do wydania ARC:
__autoreleasing jest używany do oznaczania argumentów, które są przekazywane przez referencję (id *) i są automatycznie zwalniane po zwróceniu.
Na przykład:
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
Ale jakie są zalety powyższego w porównaniu z:
-(BOOL)performOperationWithError:(NSError * __strong *)error;
Aktualizacja:
Kilka odpowiedzi odnosi się do kompilatora trick var temp, który radzi sobie z niedopasowaniem var i argument jakokorzyść z__autoreleasing
. Nie rozumiem, dlaczego kompilator nie może zrobić tego samego__strong
argument. Mam na myśli__weak
var i__strong
argument, kompilator może podobnie:
NSError * __weak error;
NSError * __strong tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
if (!OK) {
// Report the error.
}
Kompilator wie-(BOOL)performOperationWithError:(NSError * __strong *)error;
zwraca silne odwołanie (+1), więc obsługuje je tak jak każde innenew
-rodzina rodziny. Odtmp
żyje w takim samym zakresie jakerror
, kompilator może rozsądnie utrzymać go przy życiu tak długo, jak długoerror
więc__weak
odniesienie(error
) jest teraz obsługiwane przez a__strong
odniesienie(tmp
) i nie zostaną anulowane do końca zakresu.