Quel est le sens de l'id?
Je suis (essayer de) apprendre l'Objective-C et je continue à venir à travers une phrase comme:
-(id) init;
Et je comprends id
est un langage Objective C mot-clé, mais que signifient-à-dire "le compilateur traite spécifiquement id
en termes de type de pointeur règles de conversion"?
Ne id
automatiquement désigner l'objet de son droit comme un pointeur?
- Il est à l'opposé de l'ego. Pour certaines personnes c'est
void*
- Voici une discussion pertinente à la question: DONC, la question
Vous devez vous connecter pour publier un commentaire.
id
est un pointeur vers un type quelconque, mais à la différence devoid *
il renvoie toujours à un Objectif-C objet. Par exemple, vous pouvez ajouter quoi que ce soit de typeid
à un NSArray, mais ces objets doivent répondre àretain
etrelease
.Le compilateur est totalement heureux pour vous de façon implicite un cast d'un objet à
id
, et pour vous de jeterid
à n'importe quel objet. C'est à la différence de toute autre conversion implicite en Objective-C, et est la base pour la plupart des types de conteneurs dans le Cacao.id
définition esttypedef struct objc_object *id;
, de sorte qu'il pointe vers unObjc
objet.NSObject
? moyen, puis-je remplacerid
avecNSObject
quand c'est un type de retour?id
est un pointeur vers un Objectif-objet C (objc_object
). Il n'est pas seulement un vide pointeur et vous ne devriez pas traiter comme ça. Il fait référence à un objet qui doit avoir une validitéisa
pointeur. Les valeurs qui peuvent être stockées dansid
sont également pas seulement limitée à laNSObject
et de ses descendants, ce qui commence à donner un sens à l'existence de laNSObject
protocole ainsi que de laNSProxy
classe qui n'a même pas hériter deNSObject
. Le compilateur va vous permettre d'affecter un objet référencé par typeid
à tout type d'objet, assigner n'importe quel type d'objet àid
, ainsi que d'envoyer un message (que le compilateur a vu) sans avertissement.id
est un type générique. Cela signifie que le compilateur s'attend à tout objet type de il y, et de ne pas appliquer des restrictions. Il peut être utile si vous vous attendez à utiliser plus d'une classe d'objets; vous pouvez ensuite utiliser l'introspection pour savoir à quelle classe il est.id
suppose automatiquement un pointeur, comme tous les objets en Objective-C sont transmis en tant que pointeurs/références.Quelques Ressources Supplémentaires:
id vs NSObject vs id*
Objective-C Programmation (Wikibooks)
Introspection
Typage Dynamique
être utiliser pour un objet de n'importe quel type n'importe quelle classe a-t-elle.
id est la finale de la super-type de tous les objets.
En java ou en c#, nous utilisons comme ce
mais en objective-c
Oui et non. Il est vrai que le fait d'avoir
id x
x désigne comme un pointeur, mais en disant que le type de pointeur règles de conversion applicables est faux, parce que "id" est de type particulier, des règles de conversion. Par exemple, avec unvoid *
pointeur vous ne pouvez pas faire ceci:Au contraire, il est possible avec l'id:
Voir plus d'utilisation de type id de l'objectif c exemples.
En outre, dans le "moderne" Objective-C, il est préférable d'utiliser les
instancetype
au lieu de "id" sur "init" méthodes. Il y a même une conversion automatique de l'outil dans Xcode pour que cela change.Lisez à propos de instancetype: Serait-il avantageux de commencer à utiliser instancetype au lieu de l'id?