objective-c ios xcode ios5 xcode4.4

objective c - ¿Por qué hay @interface arriba @implementation?



objective-c ios (4)

Allí puede declarar métodos privados y propiedades que solo desea usar en su clase, pero no exponer a otras clases.

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

TestTableViewController.h :

#import <UIKit/UIKit.h> @interface TestTableViewController : UITableViewController @end

y (generado automáticamente) class.m encuentro:

#import "TestTableViewController.h" @interface TestTableViewController () @end @implementation TestTableViewController ... methods delegated from UITable delegates @end

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

Gracias por adelantado


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 usa para declarar algún tipo de método privado que el autor no quiere exponer en el archivo de encabezado

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

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

Y la implementació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 amplía 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.


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.


La segunda directiva @interface encuentra en el archivo de implementación (.m); puede deducir de ella 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 que se ve aquí se llama "extensión de clase" y se indica mediante un par de paréntesis vacíos:

@interface MyClass ()

Este es particularmente importante porque puede usar esto para agregar variables de instancia adicionales a su clase.

El segundo, llamado "categoría", está indicado por un par de paréntesis no vacíos, que incluye el nombre de la categoría, así:

@interface MyClass (CategoryName)

y 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.