Создание частных свойств в Objective-C - PullRequest
8 голосов
/ 08 июля 2011

В Objective-C есть своего рода хакерский способ создания частных методов в файле .m:

@interface FooClass (PrivateMethods)
- (void) doBar:(id)barAction withBaz:(id)bazAction;
@end

Это прекрасно работает для методов.Я попытался сделать то же самое со свойством:

@interface BarClass (PrivateMethods)
@property (nonatomic, strong) BazObject *myBaz;
@end

@implementation BarClass
@synthesize myBaz = _myBaz;
[...]
@end

Это привело к предупреждению компиляции: свойство, объявленное в категории 'PrivateMethods', не может быть реализовано в реализации класса.Я пытался переместить свою собственность в категорию:

@implementation BarClass (PrivateMethods)
@synthesize myBaz = _myBaz;
@end

Затем: @synthesize is not allowed in a category's implementation.

Очевидный ответ: «Прекратите попытки, просто используйте ivars», но мне сказалилюди в Apple, что они (лично) перешли на полностью использование свойств.Безопасность, которую они приносят (например, безопасность на пистолете, тяжелее выстрелить себе в ногу), делает меня счастливым внутри, так есть ли способ сделать это, не прибегая к голым иварам?

Ответы [ 2 ]

17 голосов
/ 08 июля 2011

Используйте расширение класса вместо категории (обратите внимание на отсутствие названия категории в скобках):

@interface BarClass ()
@property (nonatomic, strong) BazObject *myBaz;
@end

@implementation BarClass
@synthesize myBaz = _myBaz;
[...]
@end

Возможно, вы захотите прочитать этот вопрос (и ответы)а также: Создает ли частный @property переменную экземпляра @private?

4 голосов
/ 08 июля 2011

Это то, что я сделал, и это работает для меня. Изменение в том, что вы больше не создаете категории. Скорее вы создаете расширения самого класса.

@interface BarClass ()
@property (nonatomic, retain) BazObject *myBaz;
@end

@implementation BarClass
@synthesize myBaz = _myBaz;
[...]
@end
...