Распространено поставить поставить дополнительную @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-файле - это категория, которую вы не можете определить в ней.
Update 6 августа '12: Objective-C развивалась так как этот ответ был написан:
ivars
могут быть объявлены в расширении класса (и всегда может быть - неверный ответ)
@synthesize
не требуется
ivars
теперь может быть объявлен в фигурных скобках в верхней части @implementation
:
т шляпа,
@implementation {
id _ivarInImplmentation;
}
//methods
@end
Малый Sidenote, фактически не положить что-нибудь в скобках, когда вы объявляете частный интерфейс. В противном случае он просто создает категорию, и вы этого не хотите. '@interface Person()' будет достаточно. –
Спасибо, я не заметил этого. Я обновил свой ответ. –
Если людям интересно узнать больше о категориях .. эта [страница] (http://macdevelopertips.com/objective-c/objective-c-categories.html) была очень полезной для меня. – Tim