2012-02-01 14 views
10

que estaba buscando en algún código:¿Cuándo y por qué usas @interface ClassName (Private)? - Objective-C

@interface ClassName (Private) 

- (float)methodOne:(NSDictionary *)argOne; 
- (void)methodTwo:(NSDictionary *)argTwo; 

@end 

@implementation ClassName 
.... 

El código anterior se encuentra en la parte superior del archivo ClassName.m que aparece para definir métodos de interfaz adicionales para la clase como privada?

¿Por qué hacer esto? ¿cual es el punto? ¿Qué más podría ir a dónde (privado)? ¿Alguien tiene documentos sobre esto?

Gracias

Respuesta

16

Esta es una forma de mantener los métodos que la clase utiliza internamente de la exposición a otros. Es parte de la encapsulación. En Objective-C 2.0 (iOS y Mac OS X 10.5 +), es más común el uso de una extensión de la clase en la parte superior del archivo de implementación:

@interface ClassName() 

- (void)privateMethod; 

@end 

Una extensión de clase es realmente un caso especial de una categoría (que es lo que preguntaste) La principal diferencia es que para una categoría, el compilador no se quejará incluso si su @implementation no incluye definiciones para los métodos declarados en la categoría. Para los métodos en una extensión de clase, su clase debe implementar esos métodos en su bloque @implementation principal o obtendrá una advertencia del compilador.

Será mejor que utilice una extensión de clase en el código de iOS o Mac que se dirige como mínimo a Mac OS X 10.5 Leopard.

+0

Básicamente, '@interface NombredeClase (privada)' se deprecia forma de '@interface NombredeClase()'. ¿Correcto? – WebOrCode

+1

@WebOrCode, podría decir que, aunque no está oficialmente obsoleto, al final simplemente es una convención y uso de una característica ObjC más ampliamente aplicable (categorías). Usar '(Privado)' significa que está declarando una categoría * nombrada *, que no está en desuso. Es solo su uso como una forma de declarar propiedades "privadas" que han sido reemplazadas por extensiones de clase. –

2

Básicamente es una categoría y permite agregar métodos en el archivo .m. En estos días, la mejor manera es usar una Extensión de clase, la sintaxis es similar, solo falta el "Privado", solo dos paréntesis.

La ventaja adicional de una extensión de clase es que las propiedades también se pueden incluir y el compilador validará que todos los métodos declarados estén definidos.

Un área que es realmente útil es la capacidad de declarar un archivo de solo lectura en el archivo .h y leer escribir en el archivo .m. De esta forma, los usuarios de la clase solo tienen acceso de lectura pero la clase en sí tiene acceso completo.

Cuestiones relacionadas