Normalmente, cuando declara un objeto como id
cuenta como un objeto "cualquiera" (lo que significa que Objective-C le permitirá invocar cualquier método de cualquier clase o protocolo en el id
sin previo aviso).
Sin embargo, cuando declara un objeto como id<SomeProtocol>
, el significado cambia. En este caso, en cambio está diciendo: solo invocaré los métodos SomeProtocol
en este objeto.
El método:
- (void)release;
se declara en el protocolo NSObject
pero se han declarado explícitamente: Sólo voy a invocar MyProtocol
métodos. Entonces el compilador te advierte que hayas roto tu propia promesa.
Por lo tanto, en lugar de:
id<MyProtocol> reference;
en realidad se debe declarar:
id<MyProtocol, NSObject> reference;
o:
NSObject<MyProtocol> reference;
desde NSObject
(la clase) implementa NSObject
(el protocolo).
o:
id reference;
que es el más amplio del lote: déjame invoca nada en este objeto y nunca se quejan.
Puede también (como se sugiere Barry Wark) tienen MyProtocol
incluyen el protocolo NSObject
- aunque desde una perspectiva de diseño, que normalmente sólo se hace esto, si la aplicación de MyProtocol
necesariamente significa utilizar NSObject
. Normalmente, sólo hacemos esto si NSObject
y MyProtocol
están vinculados heritarily o semánticamente.
Un poco de información acerca de la NSObject
protocolo:
Todo se invoca retener/liberar/autorelease tras debe implementar este protocolo. Como se puede inferir de esto: básicamente todo lo que implementa el protocolo NSObject
(a pesar de que algunas cosas no descienden de la clase NSObject
base).
Otra aclaración rápida: NSObject
(la clase) y NSObject
(el protocolo) no son reimplementaciones de la misma API. Se dividen de la siguiente manera:
NSObject (protocolo) implementa todo lo necesario para manejar/inspeccionar un objeto existente en un sentido genérico (retener/liberación, IsEqual, clase, respondsToSelector: etc).
NSObject (clase) implementa métodos menos genéricas: construcción/destrucción, integración de hilo, la integración de secuencias de comandos.
En la mayoría de los sentidos, el protocolo es el más importante de los dos. Recuerde que la clase incluye el protocolo de modo que si se desciende desde NSObject, se obtiene tanto.
lo que si se pone desasignar? – user102008
No se puede asumir que no necesita retener el objeto sin más contexto. – pablasso