为什么要使用@property
with NSArray
?
我提出问题的原因是因为我的印象@properties
是主要用于利用您在使用时免费获得的getter和setter@property
,但是当您将 an 分配NSArray
给一个属性时,您知道您永远不会使用 getter 和 setter要访问数组中的对象,为什么要在这种情况下使用属性。这是否与ARC有关,换句话说,这是否被认为是一种更好的内存管理实践?
为什么要使用@property
with NSArray
?
我提出问题的原因是因为我的印象@properties
是主要用于利用您在使用时免费获得的getter和setter@property
,但是当您将 an 分配NSArray
给一个属性时,您知道您永远不会使用 getter 和 setter要访问数组中的对象,为什么要在这种情况下使用属性。这是否与ARC有关,换句话说,这是否被认为是一种更好的内存管理实践?
您使用属性来获取或设置整个数组。您还可以使用该属性来访问数组的各个元素。
将属性与数组一起使用与 ARC 或 MRC 无关。属性是封装数据的一种方式。而已。
如果您不想提供对整个数组的访问权限,请不要使用属性。如果合适,添加方法来设置/获取内部数组的各个元素。
除了其他答案已经说过的话,copy
出于安全目的,我通常喜欢我的阵列。
如果您接受NSArray
客户的请求,她可能会为您提供一个NSMutableArray
实例。如果是这种情况,并且您想确保您正在使用的数组不会意外更改,那么您最好copy
使用它而不是retain
它。
在这种情况下,属性会派上用场,因为您可以声明
@property (nonatomic, copy) NSArray * myArray;
并确保在分配后您是该数组的唯一所有者。
每当我关心数据的所有权时,我通常会将此策略用于具有可变子类的任何类,例如 、 等NSString
。NSArray
NSSet
这种策略的缺点当然是内存效率,但归根结底,工程是智能妥协的艺术。
在单个方法或类之外使用数组。ClassA.array = ClassB.array; 或者简单地以同一类的不同方法从数组中读取,因为数组将在执行后立即释放。
但是当您将 NSArray 分配给一个属性时,您知道您永远不会使用 getter 和 setter 来访问数组中的对象,为什么在这种情况下使用属性。
出于与其他对象使用属性相同的原因:
访问器:访问器用于数组本身,而不是数组中的对象。一次获取或设置整个数组并不少见:
NSArray *kids = frank.children; // 获取数组 玛丽.children = @[@“尼克”,@“山姆”,@“苏珊”];// 设置数组
抽象:使用属性而不是直接访问底层数组可以更容易地在以后更改实现,如果有必要的话。
KVC 合规性:您可以通过属性免费获得它。借助数组之类的集合,KVC 为您提供了强大的功能。您可以使用集合运算符@avg
和 @max
以及索引访问器:
int employees = [会计 countOfEmployees]; // 与 [accounting.employees count] 相同 员工 *thirdEmployee = [工程对象InEmployeesAtIndex:2]; // 与 [engineering.employees objectAtIndex:2] 相同