2012-07-21 18 views
29

Me pregunto por qué hay dos veces @interface. Uno en class.h y otro en class.m. Por ejemplo:¿Por qué hay @interface arriba @implementation?

TestTableViewController.h:

#import <UIKit/UIKit.h> 

@interface TestTableViewController : UITableViewController 

@end 

y (generado automáticamente) class.m me parece:

#import "TestTableViewController.h" 

@interface TestTableViewController() 

@end 

@implementation TestTableViewController 

... methods delegated from UITable delegates 

@end 

Así que mi pregunta es, lo que el @interface TestTableViewController() en el archivo .m se trata. ¿Por qué está allí? ¿Lo necesito?

Gracias de antemano

+0

posible duplicado de [Diferencia entre la definición de \ @interface en archivos .h y .m] (http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m- file), [¿Cuál es la declaración \ @ interface en archivos .m utilizados en proyectos iOS 5?] (http://stackoverflow.com/questions/9751057/what-is-the-interface-declaration-in-m- files-used-for-in-ios-5-projects), [Dos interfaces en archivos * .h y * .m] (http://stackoverflow.com/questions/9590917) [Declare la interfaz dentro del archivo de implementación (Objective- C)] (http://stackoverflow.com/questions/10647913/) –

Respuesta

46

La segunda directiva @interface se encuentra en el archivo de implementación (.m); se puede deducir que está destinada a declarar cosas que el creador de la clase no quería exponer al usuario de la clase. Esto generalmente significa métodos y propiedades privados y/o internos. También tenga en cuenta que hay dos tipos de hacer esto. El uno (que se puede ver aquí) se llama una "extensión de clase" y se denota por un par de paréntesis vacío:

@interface MyClass() 

Ésta le será muy importante porque se puede usar esto para añadir variables de instancia adicionales a su clase .

El segundo, llamado un "categoría", se indica mediante un par no vacío de paréntesis, que encierra el nombre de la categoría, como este:

@interface MyClass (CategoryName) 

y que también se usa para extender la clase .No puede agregar variables de instancia a una clase usando categorías, pero puede tener múltiples categorías para la misma clase, esa es la razón por la que se usa principalmente para extender las clases de sistema/infraestructura para las cuales no tiene el código fuente, por lo que una categoría, en este sentido, es exactamente lo contrario de la extensión de clase.

2

En allí se puede declarar métodos y propiedades privadas que sólo se desea utilizar en su clase, pero no lo exponga a otras clases.

3

La segunda "interfaz" define una extensión para la clase "TestTableViewController", que no es visible para alguien que solo importa el archivo h. Esta es la forma de facto para crear métodos privados en el objetivo C.

+0

No, no es una categoría, es una extensión de clase. -1. –

+1

No es muy bueno con el -1 ... La diferencia entre categorías y extensiones es en su mayoría semántica: una extensión es básicamente una categoría anónima, que requiere su implementación en el bloque de implementación principal de la clase. Por lo tanto, al establecer un nombre entre paréntesis del segundo bloque "interfaz", se creará efectivamente una categoría y no una extensión ... – dcoder

2

La interfaz en el archivo TestTableViewController.h es la declaración de una extensión de clase. Hay 2 corchetes que muestran esto. La sintaxis es la misma que para escribir una categoría para una clase. Pero en este caso se utiliza para declarar algún tipo de métodos privados el autor no quiere exponer en el archivo de cabecera

Una interfaz de categoría normal, se ve así:

@interface TestTableViewController (Your_Category_Name) 
- (void)doSomething; 
@end 

Y la aplicación correspondiente:

@implementation TestTableViewController (Your_Category_Name) 
-(void)doSomething { 
// Does something... 
} 
@end 

En su ejemplo no hay un nombre de categoría especificado, por lo que simplemente extiende la clase y puede implementar el método en la implementación normal.

Normalmente esta técnica se usa para "esconder" métodos. No están declarados en el archivo de encabezado y no son visibles si solo importa el archivo .h.

+0

¿Las categorías son útiles para todo lo que no sea declarar métodos privados y categorizar el código? –

+0

Gracias por avisarme. No lo hice ahora esto se llama extensión de clase. Solo lo he pensado como una categoría hasta ahora. Yo lo arreglare. –

+0

Incluso si no hay un nombre, ¿todavía no se está ampliando la clase? ¿Cómo podemos agregar variables de instancia? – Honey

Cuestiones relacionadas