2011-11-02 17 views
63

sto (cercando di) imparare Objective-C e continuo a venire attraverso una frase come:Qual è il significato di id?

-(id) init; 

e capisco id è un linguaggio parola chiave Objective C, ma che cosa significa dire "il compilatore specificamente tratta id in termini di regole di conversione del tipo di puntatore "?

id indica automaticamente l'oggetto alla sua destra come puntatore?

+20

E 'l'opposto del ego. Per alcune persone è "void *" –

+0

Ecco una discussione pertinente alla domanda: [domanda SO] (http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype -instead-of-id/14652187 # 14652187) – dmitri

risposta

79

id è un puntatore a qualsiasi tipo, ma a differenza di void * punta sempre a un oggetto Objective-C. Ad esempio, è possibile aggiungere qualsiasi elemento di tipo id a un NSArray, ma tali oggetti devono rispondere a retain e release.

Il compilatore è totalmente felice per voi di trasmettere implicitamente qualsiasi oggetto a id e di trasmettere id a qualsiasi oggetto. Questo è diverso da qualsiasi altro casting implicito in Objective-C, ed è la base per la maggior parte dei tipi di contenitori in Cocoa.

+0

Supplemento: la definizione di 'id' è 'typedef struct objc_object * id;', quindi punta ad un oggetto 'Objc'. – zhongwuzw

17

id è un tipo generico. Ciò significa che il compilatore si aspetta qualsiasioggetto digita lì e non imporrà restrizioni. Può essere utile se ci si aspetta di utilizzare più di una classe di oggetti; puoi quindi utilizzare l'introspezione per scoprire quale classe è. id assume 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

26

id è un puntatore a qualsiasi oggetto Objective-C (objc_object). Non è solo un puntatore vuoto e non dovresti trattarlo come tale. Fa riferimento a un oggetto che dovrebbe avere un puntatore valido isa. I valori che possono essere memorizzati in NSObject e i relativi discendenti, inoltre, non sono limitati a NSObject e iniziano a dare un senso all'esistenza del protocollo NSObject e alla classe NSProxy che non eredita nemmeno da NSObject. Il compilatore consente di assegnare un oggetto a cui fa riferimento il tipo id a qualsiasi tipo di oggetto, assegnare qualsiasi tipo di oggetto a id e inviare qualsiasi messaggio (che il compilatore abbia visto) senza preavviso.

4

Sì e no. È vero che avere id x indica x come puntatore, ma dire che le regole di conversione del tipo di puntatore sono errate, perché "id" ha regole di conversione di tipo speciale. Ad esempio, con un puntatore void * non si può fare questo:

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

Al contrario, è possibile con id:

id x; 
NSString *y = x; 

Vedi altro utilizzo di tipo id in objective c examples.

Inoltre nell'Obiettivo "moderno" è preferibile utilizzare instancetype anziché "id" sui metodi "init". C'è anche uno strumento di conversione automatica in Xcode per cambiarlo. Leggi su instanceType: Would it be beneficial to begin using instancetype instead of id?

3
  • “id” è un tipo di dati di identificatori di oggetto in Objective-C, che possono essere utilizzare per un oggetto di qualsiasi tipo, non importa quale classe ce l'ha. "id" è il tipo super finale di tutti gli oggetti.

in Java o C# usiamo come questo

Object data = someValue; 


String name =(Object)data; 

ma in c obiettivo

id data= someValue; 



NSString *name= data;