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 id
c'est un mot-clé du langage Objective C, mais que signifie dire "le compilateur traite spécifiquement id
en termes de règles de conversion de type pointeur"?
Désigne-t-il id
automatiquement l'objet à sa droite comme pointeur?
void*
Réponses:
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 n'importe quoi de typeid
à un NSArray, mais ces objets doivent répondre àretain
etrelease
.Le compilateur est totalement heureux pour vous de convertir implicitement n'importe quel objet
id
et pour vous de convertirid
en 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.la source
id
la définition de esttypedef struct objc_object *id;
, donc il pointe vers unObjc
objet.NSObject
? signifie, puis-je remplacerid
parNSObject
quand c'est un type de retour?id
est 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 unisa
pointeur valide . Les valeurs qui peuvent être stockées dans neid
sont pas seulement limitées àNSObject
et à ses descendants, ce qui commence à donner un sens à l'existence duNSObject
protocole ainsi qu'à laNSProxy
classe qui n'hérite même pas deNSObject
. Le compilateur vous permettra d'assigner un objet référencé par typeid
à 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.la source
id
est 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.id
assume 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
la source
En java ou c #, nous utilisons comme ceci
mais dans l'objectif c
la source
Oui et non. Il est vrai qu'avoir
id x
dé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 unvoid *
pointeur, vous ne pouvez pas faire ceci:Au contraire, c'est possible avec id:
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
instancetype
place 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?la source