Лучший способ сделать это с расширением класса.
.h
@interface MyClass : NSObject
@property(readonly) BOOL publiclyReadOnlyPrivatelyWritableFlag;
+ (id) myExposedFactoryMethod;
@end
.m
#import "MyClass.h"
@interface MyClass ()
@property(readwrite) BOOL publiclyReadOnlyPrivatelyWritableFlag;
+ (id) privateMethod1;
+ (id) privateMEthod2;
@end
@implementation MyClass
@synthesize publiclyReadOnlyPrivatelyWritableFlag; // no ivar -- only works in 64 bit and iPhone
+ (id) myExposedFactoryMethod
{
...
[self privateMethod1];
...
}
+ (id) privateMethod1;
{
return ...
}
+ (id) privateMEthod2;
{
return ...
}
@end
Расширение класса является лучшим решением, потому что оно является истинным расширением интерфейса класса, тогда как категория (без соответствующей реализации) является всего лишь предложением, чтобы класс реализовывал методы. То есть компилятор будет предупреждать, если вы не реализуете интерфейс - методы - объявленные в расширении класса, но не будет предупреждать, если вы сделали то же самое с именованной категорией.
Также обратите внимание, что расширение класса позволяет обновить свойство readonly
до свойства readwrite
, как показано в примере выше.