在Objective-C中创建私有属性

时间:2011-07-08 19:50:50

标签: objective-c properties private

在Objective-C中,有一种在.m文件中创建私有方法的hackish方式:

@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 个答案:

答案 0 :(得分:17)

使用class extension代替类别(请注意括号内没有类别名称):

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

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

您可能也想阅读此问题(和答案):Does a private @property create an @private instance variable?

答案 1 :(得分:4)

这就是我所做的,它对我有用。变化是您不再创建类别。相反,你正在创建类本身的扩展。

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

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