KVC阵列:getter vs索引访问器?

时间:2010-08-23 03:20:27

标签: objective-c cocoa cocoa-bindings key-value-observing key-value-coding

我对此感到困惑:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/AccessorConventions.html#//apple_ref/doc/uid/20002174-178830-BAJEDEFB

假设

@interface Office : NSObject {
  NSMutableArray *employees;
}
  1. 实施集合访问器有什么好处?

  2. [anOffice countOfEmployees]如何比[[anOffice employees] count]更好?

  3. 绑定是否取决于集合访问器还是可以完全放弃它们? 因为我使用的是真正的数组对象,所以它们对我来说似乎是多余的。如果员工不是 NSMutableArray并且没有像计数方法本身那样实现,我可以理解他们将会如何需要。

  4. 我也非常难以理解为什么会使用mutableArrayValueForKey:@"employees"取代员工财产而不仅仅是valueForKey:@"employees"

  5. 谢谢!

1 个答案:

答案 0 :(得分:3)

可以放弃集合访问者;他们不是必需的。但它们使事情变得容易多了。

拥有它们的一个原因,包括countOfEmployees,是效率:employees方法可能会返回数组对象的副本(特别是因为Office的副本是可变的,所以Office不希望其他对象从它下面改变数组),但如果您只需要知道计数或访问特定索引处的一个对象,则不需要副本。

另一个原因是发件人想要改变该属性。

  • valueForKey:会调用employees,这通常会返回不可变副本。
  • 返回一个可变副本无济于事,因为改变该数组会改变副本,而不是通过属性改变原始数据。
  • 返回原始数组不会使发件人为其更改生成KVO通知,因此任何观察该属性的内容都不会知道这些更改。这意味着UI中显示的值将过时(不会更新)。

mutableArrayValueForKey:返回一个假数组,该数组将突变消息(或者,如果没有其他内容,employeessetEmployees:消息)发送回原始对象。访问者消息确实会导致KVO通知,因此观察该属性的任何内容都将跟随这些更改,因此您的UI保持最新。

当然,您可以自己发送访问者消息。 mutableArrayValueForKey:主要用于如果要对编译时未知的属性进行更改;据推测,NSArrayController是此方法的一个用户。您不太可能需要在常规应用程序中使用mutableArrayValueForKey:,在我看来,自己发送访问者消息更容易阅读。

当它改变自己的数组时,所有这一切都适用于Office。 可以直接与其数组对象进行通信,但这不会导致KVO通知,因此没有其他人知道该属性的值已经更改。您可以在每次更改时自行发布KVO通知,但这很容易让人忘记。集合访问器和mutableArrayValueForKey:是解决这些问题的两种方法:每次访问都是一行代码,会导致KVO通知。