2012-09-28 6 views
6

Mein Verständnis der Objective-C id Art ist, dass es ein Zeiger auf ein Objekt des unbekannten Typs ist. In meinen Augen ist es wie eine Lücke * für Objective-C-Klassen mit etwas Compiler Zucker oben für Dinge wie Typprüfung. Meine Frage ist warum ist es nicht id* anstelle von id dann, da es ein Zeigertyp ist? Wenn dies Java oder C# wäre, wo Objektreferenzen nicht unter Verwendung einer * deklariert werden, wäre ich nicht so überrascht. Aber in Objective-C wird jede Klasse von C-Style-Zeigern referenziert, warum also die * für den unbekannten Objekttyp ausblenden?Warum gibt die ID in Objective-C den Stern aus?

+0

Es gibt in 'CLASS' kein Stern entweder bezeichnet„isa Zeiger.“. – kennytm

Antwort

11

Die id typedef ist bereits ein Zeiger:

typedef struct objc_object { 
    Class isa; 
} *id; 

Vom Objective-C Programming Language:

In Objective-C, Objektkennungen sind von einem bestimmten Datentyp: id. Dieser Typ ist der allgemeine Typ für jede Art von Objekt, unabhängig von der Klasse , und kann für Instanzen einer Klasse und für Klassenobjekte selbst verwendet werden.

id anObject; 

Für die objektorientierten Konstrukte von Objective-C, wie als Methode Rückgabewert ersetzt int id als Standard-Datentyp. (Für streng C Konstrukte, wie Funktionsrückgabewerte, int bleibt der Standardtyp.)

Das Schlüsselwort nil als ein Null-Objekt definiert ist, eine ID mit einem Wert von 0. id, nil, und der Andere grundlegende Objective-C-Typen sind in der Header-Datei objc/objc.h definiert.

ID als Zeiger auf ein Objekt-Datenstruktur definiert:

typedef struct objc_object { 
    Class isa; 
} *id; 

Jedes Objekt hat somit eine variable isa, die es von dem, was Klasse teilt es eine Instanz ist. Da der Klassentyp selbst ist als Zeiger definiert:

typedef struct objc_class *Class; 

die isa Variable ist häufig als die

Verwandte Themen