您可以放弃集合访问器;它们不是必需的。但它们让事情变得容易多了。
拥有它们的一个原因,包括countOfEmployees
,是效率:该employees
方法可能会返回数组对象的副本(特别是因为 Office 的副本是可变的,所以 Office 不希望其他对象从它下面改变数组),但是如果你只需要知道计数或访问特定索引处的一个对象,您不需要副本。
另一个原因是当发送者想要改变属性时。
valueForKey:
将调用employees
,它通常会返回一个不可变的副本。
- 返回一个可变副本将无济于事,因为改变该数组将改变副本,而不是通过属性改变原始。
- 返回原始数组不会使发送者对其更改触发 KVO 通知,因此观察该属性的任何人都不会知道这些更改。这意味着您的 UI 中显示的值将过时(不会更新)。
mutableArrayValueForKey:
返回一个假数组,它将突变消息(或者,如果没有别的,employees
还有setEmployees:
消息)发送回原始对象。访问者消息确实会导致 KVO 通知,因此任何观察该属性的内容都将跟随这些更改,因此您的 UI 会保持最新。
当然,您可以自己发送访问者消息。mutableArrayValueForKey:
主要用于如果您想对编译时未知的属性进行更改;NSArrayController 大概是这种方法的一个用户。您可能不需要mutableArrayValueForKey:
在常规应用程序中使用,并且在我看来,自己发送访问器消息更容易阅读。
当 Office 改变自己的数组时,所有这些也适用于 Office。它可以直接与它的数组对象对话,但这不会引起 KVO 通知,因此没有其他人会知道属性的值已更改。您可以在每次更改时自己发布 KVO 通知,但这很麻烦且容易忘记。集合访问器和mutableArrayValueForKey:
是这些问题的两种解决方案: 每次访问都是一行代码,会导致 KVO 通知。