Quelle est la signification de id?

97

J'essaye d'apprendre l'Objectif-C et je n'arrête pas de tomber sur une phrase comme:

-(id) init;

Et je comprends que idc'est un mot-clé du langage Objective C, mais que signifie dire "le compilateur traite spécifiquement iden termes de règles de conversion de type pointeur"?

Désigne-t-il idautomatiquement l'objet à sa droite comme pointeur?

GPP
la source
28
C'est l'opposé de l'ego. Pour certaines personnes qui sontvoid*
Hot Licks
Voici une discussion pertinente à la question: SO question
dmitri

Réponses:

122

idest un pointeur vers n'importe quel type, mais contrairement à void *il pointe toujours vers un objet Objective-C. Par exemple, vous pouvez ajouter n'importe quoi de type idà un NSArray, mais ces objets doivent répondre à retainet release.

Le compilateur est totalement heureux pour vous de convertir implicitement n'importe quel objet idet pour vous de convertir iden n'importe quel objet. Cela ne ressemble à aucun autre casting implicite en Objective-C et constitue la base de la plupart des types de conteneurs dans Cocoa.

Joerick
la source
11
Supplément: id la définition de est typedef struct objc_object *id;, donc il pointe vers un Objcobjet.
zhongwuzw
est-ce la même chose que NSObject? signifie, puis-je remplacer idpar NSObjectquand c'est un type de retour?
ThunderWiring
33

idest un pointeur vers n'importe quel objet Objective-C ( objc_object). Ce n'est pas seulement un pointeur de vide et vous ne devez pas le traiter comme tel. Il fait référence à un objet qui doit avoir un isapointeur valide . Les valeurs qui peuvent être stockées dans ne idsont pas seulement limitées à NSObjectet à ses descendants, ce qui commence à donner un sens à l'existence du NSObjectprotocole ainsi qu'à la NSProxyclasse qui n'hérite même pas de NSObject. Le compilateur vous permettra d'assigner un objet référencé par type idà n'importe quel type d'objet, d'assigner n'importe quel type d'objet à id, ainsi que de lui envoyer n'importe quel message (que le compilateur a vu) sans avertissement.

Joe
la source
25

idest un type générique. Cela signifie que le compilateur attendra n'importe quel type d' objet et n'appliquera pas de restrictions. Cela peut être utile si vous prévoyez d'utiliser plus d'une classe d'objets là-bas; vous pouvez ensuite utiliser l'introspection pour savoir de quelle classe il s'agit. idassume automatiquement un pointeur, car tous les objets d'Objective-C sont passés en tant que pointeurs / références.

Quelques ressources supplémentaires:
id vs NSObject vs id *
Programmation Objective-C (Wikibooks)
Introspection
Dynamic Typing

FeifanZ
la source
9
  • id est un type de données d'identificateurs d'objet en Objective-C, qui peut être utilisé pour un objet de n'importe quel type, quelle que soit sa classe. id est le super type final de tous les objets.

En java ou c #, nous utilisons comme ceci

 Object data = someValue;


 String name =(Object)data;

mais dans l'objectif c

id data= someValue;



NSString *name= data;
chancyWu
la source
5

Oui et non. Il est vrai qu'avoir id xdésigne x comme pointeur, mais dire que les règles de conversion de type pointeur s'appliquent est faux, car "id" a des règles de conversion de type spéciales. Par exemple, avec un void *pointeur, vous ne pouvez pas faire ceci:

void *x;
char *y = x; // error, this needs an explicit cast

Au contraire, c'est possible avec id:

id x;
NSString *y = x;

Voir plus d'utilisation de type id dans les exemples de l'objectif c .

De plus, dans l'Objectif C "moderne", il est préférable d'utiliser à la instancetypeplace de "id" les méthodes "init". Il existe même un outil de conversion automatique dans Xcode pour changer cela. En savoir plus sur instancetype: Serait-il avantageux de commencer à utiliser instancetype au lieu d'id?

battlmonstr
la source