objective-c interface header-files setter getter

objective c - Diferencia entre definición de interfaz @ en archivo.h y.m



objective-c interface (3)

Normalmente usamos

@interface interface_name : parent_class <delegates> { ...... } @end

método en archivo .h y en archivo .m sintetizamos las propiedades de las variables declaradas en el archivo .h.

Pero en algún código, este método @interface ..... @ end también se guarda en el archivo .m. Qué significa eso? ¿Cuál es la diferencia entre ellos?

También brinde algunas palabras sobre getters y setters para el archivo de interfaz que se define en el archivo .m ...

Gracias por adelantado


El concepto es que puede hacer que su proyecto sea mucho más limpio si limita la .h a las interfaces públicas de su clase, y luego pone detalles privados de implementación en esta extensión de clase.

cuando declaras métodos o propiedades variables en el archivo ABC.h, significa que estas propiedades y métodos de variables se pueden acceder fuera de la clase

@interface Jain:NSObject { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end

@Interface le permite declarar ivars, propiedades y métodos privados. Por lo tanto, no se puede acceder a nada de lo que declare aquí desde fuera de esta clase. En general, desea declarar todos los ivars, propiedades y métodos de forma predeterminada como privados

Simplemente diga cuando declare métodos o propiedades variables en el archivo ABC.m, significa que estas propiedades y métodos de variables no se pueden acceder fuera de la clase

@interface Jain() { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end


Es común poner una @interface adicional que define una categoría que contiene métodos privados:

Person.h:

@interface Person { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)person; @end

Person.m:

@interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented. -(void)startThinkOfWhatToHaveForDinner; @end @implementation Person @synthesize name = _name; -(NSString*)makeSmallTalkWith:(Person*)person { [self startThinkOfWhatToHaveForDinner]; return @"How''s your day?"; } -(void)startThinkOfWhatToHaveForDinner { } @end

La ''categoría privada'' (el nombre propio de una categoría sin nombre no es ''categoría privada'', es ''extensión de clase'') .m impide que el compilador advierta que los métodos están definidos. Sin embargo, como la @interface en el archivo .m es una categoría, no puede definir ivars en ella.

Actualización del 6 de agosto de 2012: Objective-C ha evolucionado desde que se escribió esta respuesta:

  • ivars se pueden declarar en una extensión de clase (y siempre podría ser - la respuesta fue incorrecta)
  • @synthesize no es obligatorio
  • ivars ahora se pueden declarar entre llaves en la parte superior de @implementation :

es decir,

@implementation { id _ivarInImplmentation; } //methods @end


incluso puede crear otras clases en un archivo .m, por ejemplo, otras clases pequeñas que heredan de la clase declarada en el archivo .h pero que tienen un comportamiento levemente diferente. Puedes usar esto en un patrón de fábrica