J'essaye de terminer le puzzle.
__strongest la valeur par défaut pour tous les pointeurs d'objet conservables Objective-C comme NSObject, NSString, etc. C'est une référence forte. ARC équilibre avec un -releaseà la fin de la portée.
__unsafe_unretainedéquivaut à l'ancienne. Il est utilisé pour un pointeur faible sans conserver l'objet pouvant être conservé.
__weakest comme __unsafe_unretainedsauf que c'est une référence faible à mise à zéro automatique, ce qui signifie que le pointeur sera mis à nil dès que l'objet référencé sera libéré. Cela élimine le risque de pointeurs suspendus et d'erreurs EXC_BAD_ACCESS.
Mais à quoi sert exactement __autoreleasing? J'ai du mal à trouver des exemples pratiques sur le moment où je dois utiliser ce qualificatif. Je pense que ce n'est que pour les fonctions et les méthodes qui attendent un pointeur-pointeur tel que:
- (BOOL)save:(NSError**);
ou
NSError *error = nil;
[database save:&error];
qui sous ARC doit être déclaré de cette façon:
- (BOOL)save:(NSError* __autoreleasing *);
Mais c'est trop vague et j'aimerais bien comprendre pourquoi . Les extraits de code que je trouve placent le __autoreleasing entre les deux étoiles, ce qui me semble bizarre. Le type est NSError**(un pointeur-pointeur vers NSError), alors pourquoi placer __autoreleasingentre les étoiles et pas simplement devant NSError**?
De plus, il peut y avoir d'autres situations sur lesquelles je dois me fier __autoreleasing.