2008-12-11 13 views
6

estoy viendo algo de código que he heredado que se parece a lo siguiente:de uso de categorías en Objective-C

@interface SomeClass (private) 

Esto está dentro SomeClass.m, el archivo de implementación. Hay un archivo de encabezado adjunto que no sugiere que la clase esté usando una categoría. ¿Es (private) en este caso simplemente un nombre pobre dado a una categoría para SomeClass? ¿Y asumo que es perfectamente legítimo especificar categorías como estas en una implementación?

Respuesta

31

No es el nombre "privado" lo que lo hace privado; los métodos son privados porque están en una categoría declarada dentro del archivo de implementación.

Hay tres usos de una categoría, cada una de las cuales se suman los métodos a una clase (nota: los métodos solamente, no Ivars)

extender una clase de cacao existentes

Esto le permite añadir su propio métodos a una clase existente. Por ejemplo, si desea extender NSString para aplicar mayúsculas especiales, podría crear una nueva clase llamada, digamos NSString + Mayúsculas. en el NSString + Capitals.h que tendría:

@interface NSString (Capitals) 

-(NSString *)alternateCaps:(NSString *)aString; 

@end 

y en NSString + Capitals.m implementarías el método

@implementation NSString (Capitals) 
-(NSString *)alternateCaps:(NSString *)aString 
{ 
    // Implementation 
} 

Los métodos privados en una clase

Este es lo mismo que arriba, excepto que los métodos adicionales se declaran y definen en el archivo de implementación (.m) Usualmente una forma de tener métodos privados, porque no están en el archivo .h (que es el # importado por otras clases) simplemente no son visible. En este caso, la implementación de los métodos se realiza en su propio bloque de implementación. por ejemplo

// someClass.m 
@interface someClass (extension) 
-(void)extend; 
@end 

@implementation someClass 
    // all the methods declared in the .h file and any superclass 
    // overrides in this block 
@end 

@implementation someClass (extension) 
-(void)extend { 
    // implement private method here; 
} 

extensión de clase (Nuevo para 10.5 Leopard)

Una forma más sencilla de tener métodos privados. En este caso especial, el nombre de la categoría está vacío y los métodos privados se implementan en el mismo bloque que todos los demás métodos de clase.

// someClass.m 
@interface someClass() 
-(void)extend; 
@end 

@implementation someClass 
    // all the methods declared in the .h file and any superclass 
    // overrides in this block 
    // Implement private methods in this block as well. 
-(void)extend { 
    // implement private method here; 
} 

@end 

Aquí hay una link a la documentación de Apple en Categorías y extensiones.

+0

No estoy de acuerdo en que deba mezclar métodos privados (categoría) con su implementación habitual. Es una cuestión de estilo, pero me gusta mantener una clara separación. –

+0

Vale la pena señalar que la continuación de la clase (lo que usted llama una extensión de clase) es nueva en Leopard. –

+0

@Peter. Gracias por señalar eso. @Marc. En el caso en que la categoría esté vacía, los métodos deben implementarse en el bloque principal. Sin embargo, al usar el segundo método, estoy de acuerdo en que es mejor estilo poner implementaciones de categoría en su propio bloque. – Abizern

2

"Privado" es solo un nombre que sugiere que los métodos no son públicos y se usan para la implementación interna de la clase, pero no hay nada en la declaración de la categoría que lo haga cumplir.

Además, los métodos definidos en una categoría se agregan a la definición de clase en tiempo de ejecución, por lo que el archivo de encabezado que lo acompaña no necesita declarar que está utilizando una categoría: se "usa" automáticamente.

2

Lo uso para darme un lugar para declarar (y así documentar, así como cerrar el compilador sobre) los métodos de ayuda que no necesitan estar en la interfaz pública. Entonces los "consumidores" de la clase son (tácitamente, dado que no hay nada que los detenga aparte de las buenas maneras) restringidos a usar métodos definidos en el archivo de encabezado.

Cuestiones relacionadas