objective-c - KVC数组: getters vs indexed accessors?

标签 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员工] count] 有何优势?

  3. 绑定(bind)是否依赖于集合访问器,或者我可以完全放弃它们吗? 它们对我来说似乎是多余的,因为我使用的是真正的数组对象。我可以理解,如果员工不是 NSMutableArray 并且没有实现诸如 count 方法本身之类的东西,那么将如何需要它们。

  4. 我也完全困惑为什么要使用 mutableArrayValueForKey:@"employees" 来获取员工属性,而不是简单地使用 valueForKey:@"employees" >.

谢谢!

最佳答案

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

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

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

  • valueForKey: 将调用 employees,它通常会返回一个不可变的副本。
  • 返回可变副本不会有帮助,因为改变该数组将改变副本,而不是通过属性改变原始数组。
  • 返回原始数组不会使发送者能够为其更改发出 KVO 通知,因此观察该属性的任何内容都不会知道这些更改。这意味着用户界面中显示的值将过时(不会更新)。

mutableArrayValueForKey: 返回一个假数组,该数组将突变消息(或者,如果没有别的,employeessetEmployees: 消息)发送回原始对象。访问器消息确实会引起 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/

相关文章:

objective-c - 当我用 webview 显示 viewcontroller 时 SIGKILL

objective-c - 为什么我的警报显示两次?

ios - 程序化语言本地化,无需重启

macos - 如何播放系统特有的声音?例如拖放声音

macos - 在 mac 应用程序中创建功能以覆盖用户安全设置

objective-c - Aaron Hillegass Cocoa Programming for Mac OS X 第 9 章问题

cocoa - 如何在 Cocoa 中使用 Bindings+CoreData 实现 iTunes 风格的源列表?

ios - UIAlertController 有时会阻止 UIRefreshControl 隐藏

cocoa - NSArrayController 和 KVO

iphone - 检查 nsstring 是否与另一个字符串匹配