Ich versuche das Rätsel zu lösen.
__strong
ist die Standardeinstellung für alle Objektiv-C-Objektzeiger wie NSObject, NSString usw. Es ist eine starke Referenz. ARC gleicht es mit einem -release
am Ende des Bereichs aus.
__unsafe_unretained
entspricht dem alten Weg. Es wird für einen schwachen Zeiger verwendet, ohne das beibehaltene Objekt beizubehalten.
__weak
ist wie mit der __unsafe_unretained
Ausnahme, dass es sich um eine schwache Referenz mit automatischer Nullung handelt, was bedeutet, dass der Zeiger auf Null gesetzt wird, sobald die Zuordnung des referenzierten Objekts aufgehoben wird. Dadurch wird die Gefahr von baumelnden Zeigern und EXC_BAD_ACCESS-Fehlern ausgeschlossen.
Aber wofür genau ist __autoreleasing
gut? Es fällt mir schwer, praktische Beispiele zu finden, wann ich dieses Qualifikationsmerkmal verwenden muss. Ich glaube, es ist nur für Funktionen und Methoden, die einen Zeiger-Zeiger erwarten, wie:
- (BOOL)save:(NSError**);
oder
NSError *error = nil;
[database save:&error];
was unter ARC folgendermaßen deklariert werden muss:
- (BOOL)save:(NSError* __autoreleasing *);
Aber das ist zu vage und ich würde gerne verstehen, warum . Die Code-Schnipsel, die ich finde, platzieren das __autoreleasing zwischen den beiden Sternen, was für mich seltsam aussieht. Der Typ ist NSError**
(ein Zeiger-Zeiger auf NSError). Warum also __autoreleasing
zwischen den Sternen und nicht einfach vor NSError**
?
Es kann auch andere Situationen geben, auf die ich mich verlassen muss __autoreleasing
.