Es común poner un adicional @interfaceque 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 @interfacea 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
ivarsahora se puede declarar entre llaves en la parte superior de @implementation:
es decir,
@implementation {
id _ivarInImplmentation;
}
@end
@interface Person ()Será suficiente.class extensionno uncategory@interface className ()) generalmente ahora solo contendrán@propertys 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