Au-delà des objets distribués, ces annotations semblent être utilisées par ARC. Je suis tombé sur ce qui suit dans la description de clang de passage à un paramètre de sortie par writeback :
Si le paramètre n'est pas un paramètre de méthode Objective-C marqué out
entonces *p
est lu, et le résultat est écrit dans le temporaire avec une sémantique primitive.
Cela a à voir avec des méthodes comme - (BOOL)executeWithError:(out NSError **)error
.
Ici, l'ARC traite error
comme ayant un type implicite de NSError * __autoreleasing *
et, en tant que tel, il doit créer une variable temporaire d'autolibération pour contenir la passe (pour la cohérence) :
Code original
NSError *error;
[obj executeWithError:&error];
Code pseudo-transformé
NSError *error;
__autoreleasing NSError *temp;
temp = error;
[obj executeWithError:&temp];
error = temp;
Avec le code ci-dessus, la ligne temp = error
est inutile si nous savons temp
ne sera jamais lu. Si le compilateur voit out
il le déduit et exclut la ligne. (Bizarrement, je ne reçois pas d'avertissement du compilateur si je lis quand même la variable).
Il est tout à fait possible que ces annotations soient utilisées à d'autres endroits dans le compilateur et le runtime, et qu'elles soient utilisées à d'autres endroits à l'avenir.