2009-05-22 8 views
9

Según tengo entendido, los protocolos son como interfaces en otros idiomas (declaran los métodos esperados), mientras que las categorías le permiten agregar nuevos métodos a los existentes (incluso tipos que no le pertenecen)¿Por qué el iPhone SDK utiliza categorías, en lugar de protocolos, para algunos delegados?

¿Por qué? , ¿el SDK de iPhone a veces usa categorías para declarar tipos de delegados? Normalmente, esperaría que todos los delegados se digieran con el ID <MyDelegateProtocol>, pero hay muchos ejemplos en los que este no es el caso.

Por ejemplo, vea NSURLConnection. Su delegado se escribe "id" y el "contrato" se declara como una categoría en NSObject (NSURLConnectionDelegate).

Entonces, ¿cuál es la motivación para usar categorías en estos casos?

Respuesta

13

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

Supongo que la mayor parte del uso de categoría en lugar de protocolo en el iPhone SDK es un remanente de las clases de Mac equivalentes. Por ejemplo, NSURLConnection existe tanto en el SDK de Mac como en el de iPhone, por lo que es probable que el código se comparta. Como Apple aún no ha cambiado todas las clases de Mac para usar protocolos formales, nos queda algo de inconsistencia.

+0

Esa fue mi suposición, pero no estaba seguro. ¡Gracias! –

+0

Sin embargo, esperamos ver que el cambio en los protocolos llegue muy pronto. Ahora que los métodos de protocolo opcionales están permitidos, usarlos limpiará bastante el código y eliminará muchas categorías innecesarias. (Son geniales y todo, pero en lugar de aplicar métodos en NSObject durante el tiempo de ejecución, creo que tener un delegado que implemente un protocolo es mucho más limpio, tanto desde el punto de vista conceptual como desde tiempo de ejecución). –

4

Hasta la revisión de Objective-C que se lanzó con OS X 10.5 y el iPhone SDK, llamado "Objective-C 2.0", solo se podían hacer protocolos opcionales mediante el uso de categorías. En Objective-C 2.0, se agregó una nueva palabra clave @optional en los protocolos para marcar qué métodos eran opcionales (el resto se requiere implícitamente).

Así que creo que lo que ves es un ligero rezago de los días anteriores a la palabra clave @optional.

Editar: Para responder al seguimiento que apareció en la pregunta original: La motivación para usar una categoría en NSObject/id para un protocolo informal es en parte documentar y agrupar los métodos que el objeto puede llamar en su fuente de datos (o delegar o lo que sea), y en menor grado para evitar las advertencias del compilador de que está llamando a métodos que el compilador no sabe estarán presentes en el objeto que recibe la llamada. Imagínese que es el único que implementa la clase que llama a estos métodos de origen de datos: probablemente quiera verificar que el método esté presente utilizando [obj respondsToSelector: @selector (my: datasource: method :)] siempre que esté interesado en llamar a mi : datasource: method: método en el objeto obj.

+0

Tiene sentido, ¡gracias! –

1

Ese es un legado que proviene de objetivo-c 1.0, que no tiene "método de protocolo opcional".

Cuestiones relacionadas