在 Objective-C 中创建私有属性

Posted

技术标签:

【中文标题】在 Objective-C 中创建私有属性【英文标题】:Creating private properties in Objective-C 【发布时间】:2011-10-01 13:32:24 【问题描述】:

在 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 的员工告诉我,他们(个人)已经转向完全使用属性。他们带来的安全感(就像枪上的安全感,更难射中自己的脚)让我内心都很开心,那么有什么方法可以做到这一点而不诉诸裸体 ivars?

【问题讨论】:

【参考方案1】:

使用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?

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于在 Objective-C 中创建私有属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 XCTest 在 Objective-C 静态库中创建测试用例

如何在 Objective-C 中创建一个空白的透明 png?

在 Objective-C 中创建常量的最佳方法是啥

如何在 iOS Objective-c 的 UICollectionView 中创建无限滚动

在Objective-C中创建字符串

如何在 iOS 中创建滑动导航(在 Objective-C 中)