id
ist ein spezieller Schlüsselbegriff, der in Objective-C verwendet wird, um "irgendeine Art von Objekt" zu bedeuten. Es enthält keinen isa
-Zeiger (isa
gibt dem Objekt Zugriff auf seine Klasse und über die Klasse auf alle Klassen, von denen es erbt), daher verlieren Sie Informationen zur Kompilierungszeit über das Objekt.
NSString* aString = @"Hallo";
id anObj = aString;
NSObject
enthält einen isa
-Zeiger.
NSString* aString = @"Hallo";
NSObject* anObj = aString;
Von Objective-C ist eine dynamische Sprache
Betrachten Sie den folgenden Code:
id someObject = @"Hallo, Welt!";
[someObject removeAllObjects];
In diesem Fall wird someObject auf eine Instanz von NSString
verweisen, aber der Compiler weiß nichts über diese Instanz, außer dass es sich um irgendeine Art von Objekt handelt. Die Nachricht removeAllObjects
wird von einigen Cocoa- oder Cocoa-Touch-Objekten definiert (wie z.B. NSMutableArray
), daher beschwert sich der Compiler nicht, obwohl dieser Code zur Laufzeit eine Ausnahme erzeugen würde, da ein NSString-Objekt nicht auf removeAllObjects
reagieren kann.
Das Umschreiben des Codes zur Verwendung eines statischen Typs:
NSString *someObject = @"Hallo, Welt!";
[someObject removeAllObjects];
bedeutet, dass der Compiler jetzt einen Fehler generiert, da removeAllObjects
in keiner öffentlichen NSString
-Schnittstelle deklariert ist, von der er weiß.