0

为什么要使用@propertywith NSArray

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

4

4 回答 4

4

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

将属性与数组一起使用与 ARC 或 MRC 无关。属性是封装数据的一种方式。而已。

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

于 2013-04-22T21:24:09.763 回答
3

除了其他答案已经说过的话,copy出于安全目的,我通常喜欢我的阵列。

如果您接受NSArray客户的请求,她可能会为您提供一个NSMutableArray实例。如果是这种情况,并且您想确保您正在使用的数组不会意外更改,那么您最好copy使用它而不是retain它。

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

@property (nonatomic, copy) NSArray * myArray;

并确保在分配后您是该数组的唯一所有者。

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

这种策略的缺点当然是内存效率,但归根结底,工程是智能妥协的艺术。

于 2013-04-22T21:30:22.847 回答
2

在单个方法或类之外使用数组。ClassA.array = ClassB.array; 或者简单地以同一类的不同方法从数组中读取,因为数组将在执行后立即释放。

于 2013-04-22T21:23:42.070 回答
2

但是当您将 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] 相同
于 2013-04-22T21:51:48.450 回答