Обычно добавляется дополнительная @interface
, определяющая категорию, содержащую частные методы:
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
«Частная категория» (собственное имя для безымянной категории - это не «частная категория», а «расширение класса») .m не позволяет компилятору предупреждать о том, что методы определены. Однако, поскольку @interface
в файле .m есть категория, вы не можете определить в ней ivars.
Обновление от 6 августа 2012 г .: Objective-C эволюционировал с момента написания этого ответа:
ivars
может быть объявлено в расширении класса (и всегда могло быть - ответ был неверным)
@synthesize
не требуется
ivars
теперь можно объявить в фигурных скобках вверху @implementation
:
то есть,
@implementation {
id _ivarInImplmentation;
}
@end
@interface Person ()
будет достаточно.class extension
не а»category
@interface className ()
) теперь обычно будут содержать только частные@property
s.источник
вы даже можете создавать другие классы в файле .m, например другие небольшие классы, которые наследуются от класса, объявленного в файле .h, но имеют несколько иное поведение. Вы можете использовать это в заводском шаблоне
источник