11 Stimmen

IOS > "id" vs. NSObject

Gibt es einen Unterschied zwischen der Beziehung zu einem Object auf polymorphe Weise mit dem Typ id als mit NSObject *?

Auf welche Weise ist:

NSString* aString = @"Hello";
id anObj = aString;

anders als:

NSString* aString = @"Hello";
NSObject* anObj = aString;

13voto

Parag Bafna Punkte 22529

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;

Bildbeschreibung hier eingeben

NSObject enthält einen isa-Zeiger.

NSString* aString = @"Hallo";
NSObject* anObj = aString;

Bildbeschreibung hier eingeben

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ß.

7voto

Wain Punkte 118580

id ist generisch. Wenn Sie id verwenden, sagen Sie dem Compiler, dass Sie später Details zur Verwendung ausfüllen werden. Der Compiler geht davon aus, dass Ihr Code korrekt ist und warnt Sie nicht vor irgendetwas. Zur Laufzeit werden Prüfungen durchgeführt, um zu überprüfen, was Sie versuchen zu tun, und Sie erhalten eine Ausnahme, wenn Ihr Code falsch ist.

NSObject ist spezifisch. Wenn Sie NSObject verwenden, sagen Sie dem Compiler genau, was das Objekt ist. Wenn Sie Methoden darauf aufrufen, werden sie mit dem abgeglichen, was NSObject versteht. Sie erhalten Kompilierungsfehler, wenn Sie einen Fehler machen.

Bei alldem können Sie in beiden Fällen einfach casten, um zu einem anderen Klassen-Typ zu gelangen.

Ihre Sorge ist, was Sie in Zukunft mit dem Verweis machen werden. Im Allgemeinen hat die Verwendung von NSObject keine Vorteile.

2voto

manujmv Punkte 6440
  1. id ist ein Sprachschlüsselwort, aber die NSObject ist die Basisklasse in Objective-C.
  2. Für id müssen Sie das Objekt nicht typisieren. Aber für NSObject müssen Sie es in NSObject typisieren.
  3. Ein id-Objekt kann verwendet werden, um beliebige Methoden aufzurufen. Aber ein NSObject-Objekt kann nur bestimmte Methoden aufrufen, die in NSObject definiert sind.

0voto

Hussain Shabbir Punkte 14313

Wenn Sie id verwenden, können Sie jede bekannte Nachricht senden, und wenn Sie NSObject * verwenden, können Sie nur Nachrichten senden, die von NSObject deklariert sind (nicht Methoden einer Unterklasse), sonst wird eine Warnung erzeugt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X