Normalerweise, wenn Sie ein Objekt als id
Es gilt als "any"-Objekt (was bedeutet, dass Objective-C den Aufruf jeder Methode aus jeder Klasse oder jedem Protokoll auf dem id
ohne Vorwarnung).
Wenn Sie jedoch ein Objekt als id<SomeProtocol>
, ändert sich die Bedeutung. In diesem Fall sagen Sie stattdessen: Ich werde mich nur auf SomeProtocol
Methoden auf dieses Objekt.
Die Methode:
- (void)release;
wird in der Datei NSObject
Protokolls, aber Sie haben ausdrücklich darauf hingewiesen: Ich werde mich nur auf MyProtocol
Methoden. Der Compiler gibt also eine Warnung aus, um Ihnen mitzuteilen, dass Sie Ihr eigenes Versprechen gebrochen haben.
Daher wird anstelle von:
id<MyProtocol> reference;
sollten Sie eigentlich erklären:
id<MyProtocol, NSObject> reference;
oder:
NSObject<MyProtocol> reference;
seit NSObject
(die Klasse) implementiert NSObject
(das Protokoll).
oder:
id reference;
die am weitesten gefasst ist: Ich kann mich auf dieses Objekt berufen und mich nie beschweren.
Sie können auch (wie von Barry Wark vorgeschlagen) MyProtocol
umfassen die NSObject
Protokolls - obwohl Sie dies aus der Sicht des Designs normalerweise nur tun, wenn Sie MyProtocol
bedeutet zwangsläufig die Verwendung NSObject
. Normalerweise tun wir dies nur, wenn NSObject
y MyProtocol
vererblich oder semantisch miteinander verbunden sind.
Ein paar Informationen über die NSObject
Protokoll:
Alles, worauf Sie retain/release/autorelease anwenden, muss dieses Protokoll implementieren. Wie Sie daraus ableiten können, implementiert im Grunde alles das NSObject
Protokoll (auch wenn einige Dinge nicht von der NSObject
Basisklasse).
Noch eine kurze Klarstellung: NSObject
(die Klasse) und NSObject
(das Protokoll) sind keine Neuimplementierungen desselben API. Sie sind wie folgt aufgeteilt:
-
NSObject (Protokoll) implementiert alles, was erforderlich ist, um ein vorhandenes Objekt in einem generischen Sinne zu behandeln/zu untersuchen (retain/release, isEqual, class, respondsToSelector: usw.).
-
NSObject (Klasse) implementiert weniger generische Methoden: Aufbau/Zerstörung, Thread-Integration, Skripting-Integration.
In den meisten Fällen ist also das Protokoll das wichtigere von beiden. Denken Sie daran, dass die Klasse das Protokoll enthält. Wenn Sie also von NSObject abstammen, erhalten Sie beides.