¿Por qué utiliza el iPhone SDK categorías, en lugar de protocolos, para algunos delegados?
-
23-08-2019 - |
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
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
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".