为什么在iOS中使用@property作为NSArrays

时间:2013-04-22 21:21:11

标签: objective-c properties

为什么要将@propertyNSArray一起使用?

我的问题的原因是因为我认为@properties主要用于利用免费获得的 getter setter 当您使用@property时,但是当您为属性分配NSArray时,您知道永远不会使用getter和setter来访问数组中的对象,为什么在这种情况下使用属性。这是否与 ARC 有关,换句话说,这被认为是更好的内存管理实践吗?

4 个答案:

答案 0 :(得分:4)

您使用属性来获取或设置整个数组。您还可以使用该属性访问数组的各个元素。

使用带有数组的属性与ARC或MRC无关。属性是一种封装数据的方法。那就是它。

如果您不希望提供对整个阵列的访问权限,那么请不要使用属性。如果合适,添加方法来设置/获取内部数组的各个元素。

答案 1 :(得分:3)

除了其他答案已经说过的内容之外,出于安全考虑,我通常喜欢copy我的数组。

如果您接受客户端的NSArray,她可能会为您提供NSMutableArray个实例。如果是这种情况,并且您希望确保您正在使用的阵列没有意外更改,那么您最好copy而不是retain它。

属性在这种情况下派上用场,因为你可以声明

@property (nonatomic, copy) NSArray * myArray;

并确保在分配之后您是该阵列的唯一所有者。

每当我关心数据的所有权时,我通常会将此策略用于任何具有可变子类的类,例如NSStringNSArrayNSSet等等。

这种策略的缺点当然是内存效率,但最终工程技术是智能妥协的艺术。

答案 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]