Was bedeutet id?

97

Ich lerne (versuche) Objective-C und stoße immer wieder auf einen Satz wie:

-(id) init;

Ich verstehe, dass ides sich um ein Schlüsselwort in der Sprache Objective C handelt. Was bedeutet es jedoch zu sagen, dass der Compiler iddie Konvertierungsregeln für Zeigertypen speziell behandelt ?

Ist iddas Objekt automatisch zu ihrem Recht als Zeiger bezeichnen?

GPP
quelle
28
Es ist das Gegenteil des Ego. Für einige Leute ist dasvoid*
Hot Licks
Hier ist eine Diskussion relevant für die Frage: SO Frage
dmitri

Antworten:

122

idist ein Zeiger auf einen beliebigen Typ, zeigt jedoch anders als void *immer auf ein Objective-C-Objekt. Sie können beispielsweise ideinem NSArray alles Typische hinzufügen, aber diese Objekte müssen auf retainund reagieren release.

Der Compiler ist total glücklich , für Sie implizit ein beliebiges Objekt zu werfen zu id, und für Sie zu Guss idauf ein beliebiges Objekt. Dies ist anders als jedes andere implizite Casting in Objective-C und die Grundlage für die meisten Containertypen in Cocoa.

Joerick
quelle
11
Ergänzung: id Die Definition lautet typedef struct objc_object *id;, also zeigt sie auf ein ObjcObjekt.
Zhongwuzw
ist es das gleiche wie NSObject? Mittel, kann ich ersetzen idmit , NSObjectwenn es ein Rückgabetyp?
ThunderWiring
33

idist ein Zeiger auf ein Objective-C-Objekt ( objc_object). Es ist nicht nur ein ungültiger Zeiger, und Sie sollten ihn nicht so behandeln. Es verweist auf ein Objekt, das einen gültigen isaZeiger haben sollte. Die Werte, in denen gespeichert idwerden kann, sind auch nicht nur auf NSObjectund seine Nachkommen beschränkt, was die Existenz des NSObjectProtokolls sowie der NSProxyKlasse, von der nicht einmal geerbt wird , zu verstehen beginnt NSObject. Mit dem Compiler können Sie idjedem Objekttyp ein Objekt zuweisen, auf das nach Typ verwiesen wird , jedem Objekttyp einen Objekttyp zuweisen idund jede Nachricht (die der Compiler gesehen hat) ohne Vorwarnung senden.

Joe
quelle
25

idist ein generischer Typ. Dies bedeutet, dass der Compiler dort einen Objekttyp erwartet und keine Einschränkungen erzwingt. Dies kann nützlich sein, wenn Sie erwarten, dass dort mehr als eine Objektklasse verwendet wird. Sie können dann Introspektion verwenden, um herauszufinden, um welche Klasse es sich handelt. idnimmt automatisch einen Zeiger an, da alle Objekte in Objective-C als Zeiger / Referenzen übergeben werden.

Einige zusätzliche Ressourcen:
id vs NSObject vs id *
Objektive C-Programmierung (Wikibooks)
Introspection
Dynamic Typing

FeifanZ
quelle
9
  • id ist ein Datentyp von Objektkennungen in Objective-C, der für ein Objekt eines beliebigen Typs verwendet werden kann, unabhängig davon, welche Klasse es hat. id ist der letzte Supertyp aller Objekte.

In Java oder C # verwenden wir so

 Object data = someValue;


 String name =(Object)data;

aber im Ziel c

id data= someValue;



NSString *name= data;
chancyWu
quelle
5

Ja und nein. Es ist wahr, dass id xes falsch ist, x als Zeiger zu bezeichnen, aber zu sagen, dass die Regeln für die Konvertierung des Zeigertyps gelten, ist falsch, da "id" spezielle Regeln für die Typkonvertierung hat. Mit einem void *Zeiger können Sie dies beispielsweise nicht tun:

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

Im Gegenteil, es ist möglich mit id:

id x;
NSString *y = x;

Weitere Informationen zur Verwendung der Typ- ID finden Sie in den Beispielen für Ziel c .

Außerdem wird im "modernen" Ziel C die Verwendung instancetypevon "id" für "init" -Methoden bevorzugt . Es gibt sogar ein automatisches Konvertierungswerkzeug in Xcode, um dies zu ändern. Lesen Sie mehr über instancetype: Wäre es vorteilhaft, instancetype anstelle von id zu verwenden?

Battlmonstr
quelle