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