Warum tack, ein Protokoll NSObject um eine Protokoll-Implementierung
Ich gesehen habe einige code, die der folgenden ähnelt:
@protocol MyProtocol <NSObject>
//write some methods.
@end
Gibt es einen bestimmten Grund, warum MyProtocol entspricht der NSObject-Protokoll? Ist das nicht eher redundant, wenn Sie etwas tun, wie zum Beispiel:
id <MyProtocol> foo; //foo here conforms to NSObject AND MyProtocol?
Nur neugierig, was die Logik ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir ziemlich sicher, dass der Grund, warum Sie dies tun ist das hinzufügen der NSObject-Mitglieder (sprich wie retain und release) zu Protokoll. Technisch können Sie immer noch senden diese Nachrichten sowieso, aber Sie erhalten eine compiler-Warnung ohne.
Wenn Sie eine variable deklarieren, wie
den Objective-C compiler weiß, nur über die Methoden in
MyProtocol
und erzeugen so eine Warnung, wenn Sie versuchen, rufen Sie dieNSObject
Methoden, wie-retain/-release
auf diese Instanz. So, Kakao definiert eineNSObject
Protokoll, dass Spiegel dieNSObject
Klasse und Instanz-Methoden. Indem er erklärt, dassMyProtocol
implementiert dieNSObject
- Protokoll gibst du dem compiler einen Hinweis, dass alleNSObject
Methoden werden implementiert, indem eine Instanz, die implementiertMyProtocol
.Warum ist das alles nötig? Objective-C ermöglicht es Objekten, Abstieg von der Wurzel-Klasse. In Kakao, NSObject ist die häufigste, aber nicht die einzige Wurzel-Klasse.
NSProxy
ist auch eine root-Klasse, zum Beispiel. Daher eine Instanz vom Typid
nicht unbedingt ErbenNSObject
's Methoden.id <MyProtocol,NSObject>
statt. Ein Grund ist, dass dynamische Typisierung mitid
können Sie aufrufen, jede Methode, die der compiler finden kann, eine Erklärung für die (ohne Warnung), anstatt nur den geerbten Methoden von NSObject oder erklärt in Ihrem Protokoll. Dies kann sowohl gefährlich und unglaublich nützlich, je nachdem, ob Sie sicher Annahmen. 🙂Es ist auch sehr praktisch, wenn Sie Protokolle, die
@optional
Methoden (z.B. "modern" Objective-C 2.0 Delegierten oft verwenden diese Technik), Wenn Sie nicht zählen dieNSObject
- Protokoll, erhalten Sie Warnungen, wenn Sie versuchen, zu nennenrespondsToSelector:
auf das Objekt.Habe ich noch nie getan, dass in meinem code, aber ich konnte sehen, wie die Vorteile, um es. Wenn Sie übergeben einen parameter, wie
id <SomeProtocol>
werden Sie brauchen, um neu zu casten, wenn Sie wollen, rufen Sie eine der NSObject-Methoden auf das Objekt.Wenn Sie eine der NSObject-Protokoll Methoden wie retain, release, class, classname, der compiler wird Ihnen Warnungen, es sei denn, Ihr Protokoll enthält auch das Protokoll NSObject.