2

我对此感到困惑: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"

谢谢!

4

1 回答 1

3

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

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

另一个原因是当发送者想要改变属性时。

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

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

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

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

于 2010-08-23T03:52:57.450 回答