J'essaye de terminer le puzzle.
__strong
est 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é.
__weak
est comme __unsafe_unretained
sauf 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 __autoreleasing
entre les étoiles et pas simplement devant NSError**
?
De plus, il peut y avoir d'autres situations sur lesquelles je dois me fier __autoreleasing
.