Ich lerne (versuche) Objective-C und stoße immer wieder auf einen Satz wie:
-(id) init;
Ich verstehe, dass id
es sich um ein Schlüsselwort in der Sprache Objective C handelt. Was bedeutet es jedoch zu sagen, dass der Compiler id
die Konvertierungsregeln für Zeigertypen speziell behandelt ?
Ist id
das Objekt automatisch zu ihrem Recht als Zeiger bezeichnen?
objective-c
types
GPP
quelle
quelle
void*
Antworten:
id
ist ein Zeiger auf einen beliebigen Typ, zeigt jedoch anders alsvoid *
immer auf ein Objective-C-Objekt. Sie können beispielsweiseid
einem NSArray alles Typische hinzufügen, aber diese Objekte müssen aufretain
und reagierenrelease
.Der Compiler ist total glücklich , für Sie implizit ein beliebiges Objekt zu werfen zu
id
, und für Sie zu Gussid
auf ein beliebiges Objekt. Dies ist anders als jedes andere implizite Casting in Objective-C und die Grundlage für die meisten Containertypen in Cocoa.quelle
id
Die Definition lautettypedef struct objc_object *id;
, also zeigt sie auf einObjc
Objekt.NSObject
? Mittel, kann ich ersetzenid
mit ,NSObject
wenn es ein Rückgabetyp?id
ist 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ültigenisa
Zeiger haben sollte. Die Werte, in denen gespeichertid
werden kann, sind auch nicht nur aufNSObject
und seine Nachkommen beschränkt, was die Existenz desNSObject
Protokolls sowie derNSProxy
Klasse, von der nicht einmal geerbt wird , zu verstehen beginntNSObject
. Mit dem Compiler können Sieid
jedem Objekttyp ein Objekt zuweisen, auf das nach Typ verwiesen wird , jedem Objekttyp einen Objekttyp zuweisenid
und jede Nachricht (die der Compiler gesehen hat) ohne Vorwarnung senden.quelle
id
ist 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.id
nimmt 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
quelle
In Java oder C # verwenden wir so
aber im Ziel c
quelle
Ja und nein. Es ist wahr, dass
id x
es 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 einemvoid *
Zeiger können Sie dies beispielsweise nicht tun:Im Gegenteil, es ist möglich mit id:
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
instancetype
von "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?quelle