2013-12-13 1 views
6

In Objective-C werden häufig für Delegate-Deklaration verwendet.Unterschied zwischen ID <protocol> und NSObject <protocol>

Was sind die Hauptunterschiede zwischen ID und NSObject? Wann möchten Sie einen gegen den anderen verwenden?

+0

Hilfreiche http://stackoverflow.com/questions/466777/whats-the-difference-between-declaring-a-variable-id- and-nsobject – Maulik

+2

Dies ist kein Duplikat, weil "id 'vs' NSObject * '" und "' id vs NSObject * "' sind signifikant verschiedene Fragen. Abstimmung zum erneuten Öffnen –

+0

Martin hat recht, es ist nicht dasselbe. – Boon

Antwort

8

id<protocol> obj ist die Deklaration für jedes Objekt, das dem angegebenen Protokoll entspricht. Sie können jede Nachricht vom angegebenen Protokoll an das Objekt senden (oder von den Protokollen , die <protocol> erbt).

NSObject<protocol> *obj ist die Erklärung für jedes Objekt, das

  • dem gegebenen Protokoll entspricht, und
  • aus NSObject abgeleitet.

Das bedeutet, dass im zweiten Fall können Sie alle Methoden aus der NSObject Klasse an das Objekt senden, zum Beispiel

id y = [obj copy]; 

, die ein Compiler-Fehler im ersten Fall geben würden.

Die zweite Deklaration bedeutet auch, dass obj dem NSObjectProtokoll entspricht. Aber das macht keinen Unterschied, ob <protocol> aus dem NSObject Protokoll abgeleitet:

@protocol protocol <NSObject> 
+0

Danke Martin. Also ID ist das gleiche funktional wie NSObject , wenn das Protokoll von abgeleitet ist? – Boon

+0

@Boon: Nein. * "Dies macht keinen Unterschied" * gilt nur für den letzten Teil der Antwort, dass sowohl 'id obj' als auch' NSObject * obj 'bedeuten, dass das Objekt dem NSObject-Protokoll entspricht. - Vielleicht sollte ich den letzten Teil aus der Antwort löschen, es macht es nur noch verwirrender. –

+0

Hab es, danke. – Boon