Es común poner un adicional @interface
que defina una categoría que contiene métodos privados:
Persona.h:
@interface Person
{
NSString *_name;
}
@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end
Persona.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 adecuado para una categoría sin nombre no es 'categoría privada', es 'extensión de clase') .m evita que el compilador advierta que los métodos están definidos. Sin embargo, debido @interface
a que el archivo .m es una categoría, no puede definir ivars en él.
Actualización 6 de agosto de 2012: Objective-C ha evolucionado desde que se escribió esta respuesta:
ivars
se puede declarar en una extensión de clase (y siempre podría ser, la respuesta era incorrecta)
@synthesize
no es requerido
ivars
ahora se puede declarar entre llaves en la parte superior de @implementation
:
es decir,
@implementation {
id _ivarInImplmentation;
}
@end
@interface Person ()
Será suficiente.class extension
no uncategory
@interface className ()
) generalmente ahora solo contendrán@property
s privados .fuente
incluso puede crear otras clases en el archivo .m, por ejemplo, otras clases pequeñas que heredan de la clase declarada en el archivo .h pero que tienen un comportamiento ligeramente diferente. Podrías usar esto en un patrón de fábrica
fuente