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:
-
ivarsse pueden declarar en una extensión de clase (y siempre podría ser - la respuesta fue incorrecta) -
@synthesizeno es obligatorio -
ivarsahora 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