63 votes

Objective-C in,out,inout,byref,byval, et ainsi de suite. Qu'est-ce que c'est ?

J'ai découvert quelque chose de peu familier en lisant le manuel Objective-C pour @encoding .

Table 6-2  Objective-C method encodings
Code Meaning
r    const
n    in
N    inout
o    out
O    bycopy
R    byref
V    oneway

La seule chose que je sais est oneway . Quels sont les autres ?

84voto

Bavarious Points 43993

Ce sont des annotations pour les paramètres des méthodes et les valeurs de retour qui étaient utilisées par les objets distribués. Je dis étaient parce qu'apparemment il n'y a plus aucun signe d'eux dans la documentation d'Apple. Il y avait autrefois une section sur la messagerie à distance dans le document The Objective-C Programming Language, qui est toujours référencée par le document Distributed Objects Programming Topics.

  • dans : l'argument est un argument d'entrée seulement et ne sera pas référencé plus tard
  • dehors : l'argument est un argument de sortie uniquement, utilisé pour retourner une valeur par référence
  • inout : l'argument est à la fois un argument d'entrée et de sortie
  • const : l'argument (pointeur) est constant
  • bycopy : au lieu d'utiliser un proxy/ NSDistantObject passer ou retourner une copie de l'objet
  • parréf : utiliser un objet proxy (par défaut)

J'ai trouvé une explication de ces annotations dans cette page .

23voto

Brian Nickel Points 8687

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.

0voto

Gaz_Edge Points 2275

Au cas où quelqu'un serait tombé sur cet article et aurait eu la même confusion que moi, l'argument 'in' peut aussi être un mot-clé qui représente une énumération rapide. Voir aquí pour plus de détails.

-3voto

nst Points 2332

Vous pouvez lire les sources du runtime Objective-C http://www.opensource.apple.com/source/objc4/objc4-437.1/ pour comprendre la signification de ces annotations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X