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