Qual è il significato di id?


97

Sto (cercando di) imparare Objective-C e continuo a imbattermi in una frase come:

-(id) init;

E capisco che idsia una parola chiave del linguaggio Objective C, ma cosa significa dire "il compilatore tratta specificamente idin termini di regole di conversione del tipo di puntatore"?

Non iddesignare automaticamente l'oggetto alla sua destra come un puntatore?


28
È l'opposto dell'ego. Per alcune persone questo èvoid*
Hot Licks

Ecco una discussione relativa alla domanda: Domanda SO
dmitri

Risposte:


122

idè un puntatore a qualsiasi tipo, ma a differenza di void *esso punta sempre a un oggetto Objective-C. Ad esempio, puoi aggiungere qualsiasi cosa di tipo ida un NSArray, ma quegli oggetti devono rispondere a retaine release.

Il compilatore è assolutamente felice che tu possa eseguire il cast implicito di qualsiasi oggetto ide che tu possa eseguire il cast idsu qualsiasi oggetto. Questo è diverso da qualsiasi altro casting implicito in Objective-C ed è la base per la maggior parte dei tipi di contenitore in Cocoa.


11
Supplemento: id la definizione di è typedef struct objc_object *id;, quindi puntatore a un Objcoggetto.
Zhongwuzw

è lo stesso di NSObject? significa, posso sostituire idcon NSObjectquando è un tipo restituito?
ThunderWiring


33

idè un puntatore a qualsiasi oggetto Objective-C ( objc_object). Non è solo un indicatore di vuoto e non dovresti trattarlo come tale. Fa riferimento a un oggetto che dovrebbe avere un isapuntatore valido . I valori che possono essere memorizzati idnon sono inoltre limitati a NSObjecte ai suoi discendenti, che inizia a dare un senso all'esistenza del NSObjectprotocollo e alla NSProxyclasse da cui non eredita nemmeno NSObject. Il compilatore ti consentirà di assegnare un oggetto referenziato per tipo ida qualsiasi tipo di oggetto, assegnare qualsiasi tipo di oggetto ide inviargli qualsiasi messaggio (che il compilatore ha visto) senza preavviso.


25

idè un tipo generico. Ciò significa che il compilatore si aspetterà qualsiasi tipo di oggetto e non applicherà restrizioni. Può essere utile se ti aspetti di utilizzare più di una classe di oggetti lì; puoi quindi usare l'introspezione per scoprire di che classe si tratta. idassume automaticamente un puntatore, poiché tutti gli oggetti in Objective-C vengono passati come puntatori / riferimenti.

Alcune risorse aggiuntive:
id vs NSObject vs id *
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing


9
  • id è un tipo di dati di identificatori di oggetto in Objective-C, che può essere utilizzato per un oggetto di qualsiasi tipo, indipendentemente dalla classe che possiede. id è il super tipo finale di tutti gli oggetti.

In java o c # usiamo in questo modo

 Object data = someValue;


 String name =(Object)data;

ma nell'obiettivo c

id data= someValue;



NSString *name= data;

5

Sì e no. È vero che l'aver id xdesignato x come puntatore, ma dire che si applicano le regole di conversione del tipo di puntatore è sbagliato, perché "id" ha regole speciali di conversione del tipo. Ad esempio, con un void *puntatore non puoi farlo:

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

Al contrario, è possibile con id:

id x;
NSString *y = x;

Vedere più utilizzo del tipo id negli esempi dell'obiettivo c .

Inoltre nel "moderno" Objective C si preferisce usare instancetypeinvece di "id" sui metodi "init". C'è anche uno strumento di conversione automatica in Xcode per cambiarlo. Informazioni sul tipo di istanza: sarebbe utile iniziare a utilizzare il tipo di istanza anziché l'ID?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.