假设
@interface Office : NSObject {
NSMutableArray *employees;
}
实现集合访问器有什么好处?
[anOffice countOfEmployees]
比[[anOffice员工] count]
有何优势?绑定(bind)是否依赖于集合访问器,或者我可以完全放弃它们吗? 它们对我来说似乎是多余的,因为我使用的是真正的数组对象。我可以理解,如果员工不是
NSMutableArray
并且没有实现诸如 count 方法本身之类的东西,那么将如何需要它们。我也完全困惑为什么要使用
mutableArrayValueForKey:@"employees"
来获取员工属性,而不是简单地使用valueForKey:@"employees"
>.
谢谢!
最佳答案
您可以放弃集合访问器;他们不是必需的。但它们让事情变得容易多了。
使用它们(包括 countOfEmployees
)的一个原因是效率:employees
方法可能返回数组对象的副本(特别是因为 Office 的副本是可变的,因此Office 不希望其他对象从其下方改变数组),但如果您只需要知道计数或访问特定索引处的一个对象,则不需要副本。
另一个原因是发送者想要改变属性。
valueForKey:
将调用employees
,它通常会返回一个不可变的副本。- 返回可变副本不会有帮助,因为改变该数组将改变副本,而不是通过属性改变原始数组。
- 返回原始数组不会使发送者能够为其更改发出 KVO 通知,因此观察该属性的任何内容都不会知道这些更改。这意味着用户界面中显示的值将过时(不会更新)。
mutableArrayValueForKey:
返回一个假数组,该数组将突变消息(或者,如果没有别的,employees
和 setEmployees:
消息)发送回原始对象。访问器消息确实会引起 KVO 通知,因此任何观察该属性的行为都会伴随这些更改,以便您的 UI 保持最新。
当然,您可以自己发送访问者消息。 mutableArrayValueForKey:
主要用于如果您想要更改编译时未知的属性; NSArrayController 可能是该方法的用户之一。您不太可能需要在常规应用程序中使用 mutableArrayValueForKey:
,而且在我看来,自己发送访问器消息更容易阅读。
当 Office 改变自己的数组时,所有这一切也适用于 Office。它可以直接与其数组对象对话,但这不会导致 KVO 通知,因此其他任何东西都不会知道属性的值已更改。您可以自己在每次更改时发布 KVO 通知,但这很麻烦而且很容易忘记。集合访问器和 mutableArrayValueForKey:
是这些问题的两种解决方案:每次访问都是一行代码,会导致 KVO 通知。
关于objective-c - KVC数组: getters vs indexed accessors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3544541/