Próbuję rozwiązać zagadkę.
__strongjest 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 -releasena końcu zakresu.
__unsafe_unretainedrówna się starej drodze. Służy do słabego wskaźnika bez zatrzymywania obiektu możliwego do zachowania.
__weakjest podobna __unsafe_unretainedz 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ę __autoreleasingprzydaje? 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 __autoreleasingpomiędzy gwiazdami, a nie tylko przed nimi NSError**?
Mogą też istnieć inne sytuacje, na których muszę polegać __autoreleasing.