Pregunta

Mi entendimiento es que los protocolos son como interfaces en otros idiomas - declaran los métodos esperados - (. Quizás incluso tipos que no posee), mientras que las categorías le permiten añadir nuevos métodos a los tipos existentes

¿Por qué, entonces, el iPhone SDK veces utilizan categorías para la declaración de tipos de delegado? Normalmente yo esperaría que todos los delegados sean Identificación del tecleado pero hay muchos ejemplos en los que esto no es el caso.

Por ejemplo, véase NSURLConnection. Su delegado se escribe "ID" y el 'contrato' se declara como una categoría en NSObject (NSURLConnectionDelegate).

Así que: ¿Cuál es la motivación para el uso de categorías en estos casos

¿Fue útil?

Solución

Objetivo-C 2.0 introdujo la directiva protocolo @optional, lo que le permite declarar ciertos métodos de protocolo para ser opcional. Antes de Obj-C 2.0, se utilizaron categorías para permitir métodos de delegado opcionales (específicamente, las categorías en NSObject, que se llaman protocolos informales ).

Mi conjetura es que la mayor parte del uso de la categoría-lugar-de-protocolo en el iPhone SDK es un vestigio de las clases de Mac equivalentes. Por ejemplo, existe NSURLConnection tanto en el Mac y el iPhone SDK, por lo que el código es probable compartida. Desde que Apple aún no ha pasado por cambiar todas las clases de Mac para utilizar los protocolos formales, nos queda algo de una inconsistencia.

Otros consejos

Hasta la revisión de Objective-C que se puso en marcha con OS X 10.5 y el iPhone SDK, denominada "Objective-C 2.0", se podría hacer solamente protocolos opcionales mediante el uso de categorías. En Objective-C 2.0, se añadió una nueva palabra clave @optional en los protocolos de marca que métodos fueron opcional (es implícitamente requiere el resto).

Así que creo que lo que se ve es una ligera retención de los días anteriores antes de la palabra clave @optional.

Editar: Para contestar el seguimiento que apareció en la pregunta original: La motivación para el uso de una categoría en NSObject / Identificación de un protocolo informal es parte de documentar y grupo qué métodos del objeto puede llamar en su fuente de datos (o su delegado o lo que sea), y en menor medida para evitar las advertencias del compilador que está llamando a los métodos que el compilador no sabe estará presente en el objeto que recibe la llamada. Imagine que es la de poner en práctica la clase que llama a estos métodos origen de datos - es probable que desee comprobar que el método está presente con [obj respondsToSelector: @selector (mi: fuente de datos: Método :)] siempre que esté interesado en llamar a la mi : origen de datos: método:. método en el objeto obj

Esto es un legado vino de Objective-C 1.0, que no tiene ningún "método de protocolo facultativo".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top