108 votes

Quelle est la signification de id ?

Je suis en train d'apprendre (ou d'essayer d'apprendre) Objective-C et je tombe sans cesse sur une phrase du genre :

-(id) init;

Et je comprends id est un mot-clé du langage Objective C, mais qu'est-ce que cela signifie de dire "le compilateur traite spécifiquement id en termes de règles de conversion des types de pointeurs" ?

Fait id désigne automatiquement l'objet à sa droite comme un pointeur ?

30 votes

C'est l'opposé de l'ego. Pour certaines personnes, c'est void*

0 votes

Voici une discussion pertinente pour la question : Question

1 votes

Peut-être que vous êtes ici parce que personne ne vous a parlé de l'iD

132voto

joerick Points 6215

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

Le compilateur est tout à fait heureux de vous permettre d'attribuer implicitement à n'importe quel objet le statut de id et pour que vous puissiez lancer id à n'importe quel objet. Cela ne ressemble à aucun autre casting implicite en Objective-C, et c'est la base de la plupart des types de conteneurs en Cocoa.

12 votes

Supplément : id La définition de l'UE est la suivante typedef struct objc_object *id; donc il pointe vers un Objc objet.

1 votes

Est-ce la même chose que NSObject ? signifie, puis-je remplacer id con NSObject quand il s'agit d'un type de retour ?

0 votes

35voto

Joe Points 37343

id est un pointeur vers n'importe quel objet Objective-C ( objc_object ). Il ne s'agit pas d'un simple pointeur vide et vous ne devez pas le traiter comme tel. Il fait référence à un objet qui devrait avoir une adresse valide isa pointeur. Les valeurs qui peuvent être stockées dans id ne se limitent pas non plus à NSObject et ses descendants, ce qui commence à donner un sens à l'existence de la NSObject ainsi que le protocole NSProxy qui n'hérite même pas de NSObject . Le compilateur vous permettra d'assigner un objet référencé par le type id à n'importe quel type d'objet, affecter n'importe quel type d'objet à id ainsi que de lui envoyer tout message (que le compilateur a vu) sans avertissement.

31voto

FeifanZ Points 9348

id est un type générique. Cela signifie que le compilateur s'attend à ce que tout objet et n'appliquera pas de restrictions. Cela peut être utile si vous vous attendez à utiliser plus d'une classe d'objets à cet endroit ; vous pouvez alors utiliser l'introspection pour savoir de quelle classe il s'agit. id suppose automatiquement un pointeur, car tous les objets en Objective-C sont passés comme des pointeurs/références.

Quelques ressources supplémentaires :
id vs NSObject vs id*
Programmation en Objective-C (Wikibooks)
Introspection
Typage dynamique

1 votes

Le premier lien du blog est maintenant mort, mais vous pouvez le trouver à l'adresse suivante archive.org les deux derniers liens semblent maintenant rediriger vers un site suspect, veuillez les remplacer par des liens vers archive.org : Introspection , Typage dynamique

1 votes

Les deux derniers liens étaient vers mon ancien blog J'avais le domaine pour celui-ci. J'ai juste mis à jour les liens vers leur sous-domaine Wordpress actuel.

0 votes

Merci pour la mise à jour, pouvez-vous modifier le premier lien également ? Il est toujours mort. Un lien vers archive.org est mieux que rien, je suppose.

9voto

  • id est un type de données d'identificateurs d'objets en Objective-C, qui peuvent ê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;

5voto

battlmonstr Points 61

Oui et non. Il est vrai qu'avoir id x désigne x comme un 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 tu ne peux pas faire ça :

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

Au contraire, c'est possible avec id :

id x;
NSString *y = x;

Voir d'autres utilisations de type exemples d'identification dans l'objectif c .

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

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