Habituellement, lorsque vous déclarez un objet comme id
il compte un objet "any" (ce qui signifie que Objective-C vous permettra d'invoquer n'importe quelle méthode de n'importe quelle classe ou protocole sur le id
sans avertissement). Toutefois, lorsque vous déclarez un objet en tant que id<SomeProtocol>
, la signification change. Dans ce cas, vous dites plutôt: Je n'appellerai que des méthodes SomeProtocol
sur cet objet.
La méthode:
- (void)release;
est déclaré dans le protocole NSObject
mais vous avez dit explicitement: Je ne MyProtocol
invoquer les méthodes. Ainsi, le compilateur vous donne un avertissement pour vous dire que vous avez rompu votre propre promesse.
Par conséquent, au lieu de:
id<MyProtocol> reference;
vous devez déclarer réellement:
id<MyProtocol, NSObject> reference;
ou:
NSObject<MyProtocol> reference;
depuis NSObject
(la classe) implémente NSObject
(le protocole).
ou:
id reference;
qui est le plus large du lot: permettez-moi de quoi que ce soit sur cet invoque objet et ne jamais se plaindre.
Vous pouvez également (comme Barry Wark a suggéré) ont MyProtocol
comprennent le protocole NSObject
- même si du point de vue de la conception, vous normalement faire si la mise en œuvre MyProtocol
signifie nécessairement utiliser NSObject
. Normalement, nous le faisons seulement si NSObject
et MyProtocol
sont liés héritairement ou sémantiquement.
Un peu plus d'informations sur le protocole NSObject
:
Tout ce que vous invoquez conserver/release/autorelease sur doit mettre en œuvre ce protocole. Comme vous pouvez déduire de ceci: fondamentalement tout implémente le protocole NSObject
(même si quelques choses ne descendent pas de la classe de base NSObject
).
Une autre clarification rapide: NSObject
(la classe) et NSObject
(le protocole) ne sont pas des réimplémentations de la même API. Ils se répartissent comme suit:
NSObject (protocole) met tout en œuvre nécessaire pour gérer/inspecter un objet existant dans un sens générique (conserver/libération, isEqual, classe, respondsToSelector etc).
NSObject (class) implémente des méthodes moins génériques: construction/destruction, intégration de thread, intégration de scripts.
Donc dans la plupart des sens, le protocole est le plus important des deux. Rappelez-vous que la classe inclut le protocole, donc si vous descendez de NSObject, vous obtenez les deux.
Et s'il est désalloué? – user102008
Vous ne pouvez pas supposer qu'il n'a pas besoin de conserver l'objet sans plus de contexte. – pablasso