Próbuję rozwiązać zagadkę.
__strong
jest wartością domyślną dla wszystkich zachowywalnych wskaźników obiektów Objective-C, takich jak NSObject, NSString itp. Jest to silne odniesienie. ARC równoważy to z a -release
na końcu zakresu.
__unsafe_unretained
równa się starej drodze. Służy do słabego wskaźnika bez zatrzymywania obiektu możliwego do zachowania.
__weak
jest podobna __unsafe_unretained
z tą różnicą, że jest to słabe odniesienie z automatycznym zerowaniem, co oznacza, że wskaźnik zostanie ustawiony na zero, gdy tylko obiekt, do którego się odwołuje, zostanie zwolniony. Eliminuje to niebezpieczeństwo zwisających wskaźników i błędów EXC_BAD_ACCESS.
Ale do czego dokładnie się __autoreleasing
przydaje? Trudno mi znaleźć praktyczne przykłady, kiedy muszę używać tego kwalifikatora. Uważam, że jest to tylko dla funkcji i metod, które oczekują wskaźnika-wskaźnika, takiego jak:
- (BOOL)save:(NSError**);
lub
NSError *error = nil;
[database save:&error];
które zgodnie z ARC należy zadeklarować w ten sposób:
- (BOOL)save:(NSError* __autoreleasing *);
Ale to jest zbyt niejasne i chciałbym w pełni zrozumieć, dlaczego . Fragmenty kodu, które znajduję, umieszczają __autoreleasing pomiędzy dwiema gwiazdkami, co dla mnie wygląda dziwnie. Typ to NSError**
(wskaźnik-wskaźnik do NSError), więc po co umieszczać je __autoreleasing
pomiędzy gwiazdami, a nie tylko przed nimi NSError**
?
Mogą też istnieć inne sytuacje, na których muszę polegać __autoreleasing
.