2011-07-06 15 views
5

quería comprobar que esta revisión realmente funciona y no tendrá efectos adversos en mi código:La adopción de un protocolo de una categoría

He creado una biblioteca estática con una cabecera pública MyClass.h, el resto de mi código está todo escondido. MyClass adopta el protocolo MyProtocol, que se define en MyProtocol.h. Quiero mantener MyProtocol.h oculto, pero como MyClass.h es un encabezado público, no puede encontrar MyProtocol.h si intento mantenerlo oculto como encabezado del proyecto. Mi solución:

MyClass.h:

@interface MyClass : NSObject { 
    //instance variables 
} 
// methods 
@end 

MyClass.m:

#import "MyProtocol.h" 
@interface MyClass() <MyProtocol> 
@end 

@implementation MyClass 
// implementation 
@end 

No he visto otros ejemplos de este tipo de cosas está haciendo que no sea aquí: Can a category simultaneously implement a protocol?, y el problema/respuestas terminaron sin relación con la pregunta original. Así que quería estar seguro de que esto realmente funciona como lo hace, y/o ver si hay una mejor manera de lograr lo que estoy tratando de hacer.

+3

Usar una categoría para hacer que una clase se ajuste a un protocolo es legal. –

Respuesta

6

Lo que está proponiendo es perfectamente legal y es una buena solución a su problema.

Hay una sutil distinción semántica que puede haber confundido sus búsquedas de google en este tema. Al usar paréntesis vacíos en su ejemplo, técnicamente ha declarado una "extensión de clase", no una "categoría". La sutil diferencia es que el compilador requiere que los métodos declarados dentro de una extensión de clase se implementen en el bloque @implementation principal de su clase. Por el contrario, los métodos declarados dentro de una categoría nombrada se implementan dentro de un bloque de implementación nombrado por separado, a menudo dentro de un archivo .m separado.

Cuestiones relacionadas