我正在研究Big Nerd Ranch的Objective C编程书.我看到了如下代码:
@interface BNREmployee : BNRPerson
{
NSMutableArray *_assets;
}
@property (nonatomic) unsigned int employeeID;
@property (nonatomic) unsigned int officeAlarmCode;
@property (nonatomic) NSDate *hireDate;
@property (nonatomic, copy) NSArray *assets;
-(double)yearsOfEmployment;
-(void)addAsset:(BNRAsset *)a;
-(unsigned int)valueOfAssets;
Run Code Online (Sandbox Code Playgroud)
在这段代码中,为什么要NSMutableArray *_assets在界面下声明?这与将其宣布为财产有何不同,它的目的是什么?
最后,我看到有NSArray *assets一处房产.这跟基本相同NSMutableArray *_assets吗?
我不确定他们为什么这样做,但作为一般的良好做法,您自己不应该这样做。头文件应该为类的公共接口保留。仅将该类的调用者和用户实际需要查看的内容放入其中,通常是属性、方法,也许还有extern常量。
那么问题就变成了在实现中是使用属性还是常规实例变量。这很大程度上是基于偏好的。有些人为所有东西声明属性,但根本不使用普通的 ivars。其他人在想要为相关变量声明自定义 setter/getter 时仅对所有属性使用 ivars。我属于后一个阵营,但如果一切都只是一个属性,那么它会更清晰、更容易阅读,这是有争议的。
编辑
我看错代码了。我上面所说的都是正常的,但他们所做的是公开一个与底层数据不同的 API。现在编辑我的答案。
当您声明一个没有自定义的属性@synthesize并且没有覆盖 setter 和 getter(如果适用)时,会创建一个前面带有下划线的基础变量。他们在这里所做的是NSArray在公共 API 中返回一个 ,以确保内部变量在内部使用NSMutableArray.
我想说的是,一般来说,变量声明(NSMutableArray *_assets;)仍然应该放在实现文件中。调用者可能不需要知道它在幕后是可变的。
实际上已经有很多现有的问题涉及到这一点。这是一个包含其中一些的搜索查询: https://stackoverflow.com/search ?q=mutable+ivar+immutable+property
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |