假设
@interface Office : NSObject {
NSMutableArray *employees;
}
实施集合访问器有什么好处?
[anOffice countOfEmployees]
如何比[[anOffice employees] count]
更好?
绑定是否取决于集合访问器还是可以完全放弃它们?
因为我使用的是真正的数组对象,所以它们对我来说似乎是多余的。如果员工不是 NSMutableArray
并且没有像计数方法本身那样实现,我可以理解他们将会如何需要。
我也非常难以理解为什么会使用mutableArrayValueForKey:@"employees"
取代员工财产而不仅仅是valueForKey:@"employees"
。
谢谢!
答案 0 :(得分:3)
你可以放弃集合访问者;他们不是必需的。但它们使事情变得容易多了。
拥有它们的一个原因,包括countOfEmployees
,是效率:employees
方法可能会返回数组对象的副本(特别是因为Office的副本是可变的,所以Office不希望其他对象从它下面改变数组),但如果您只需要知道计数或访问特定索引处的一个对象,则不需要副本。
另一个原因是发件人想要改变该属性。
valueForKey:
会调用employees
,这通常会返回不可变副本。 mutableArrayValueForKey:
返回一个假数组,该数组将突变消息(或者,如果没有其他内容,employees
和setEmployees:
消息)发送回原始对象。访问者消息确实会导致KVO通知,因此观察该属性的任何内容都将跟随这些更改,因此您的UI保持最新。
当然,您可以自己发送访问者消息。 mutableArrayValueForKey:
主要用于如果要对编译时未知的属性进行更改;据推测,NSArrayController是此方法的一个用户。您不太可能需要在常规应用程序中使用mutableArrayValueForKey:
,在我看来,自己发送访问者消息更容易阅读。
当它改变自己的数组时,所有这一切都适用于Office。 可以直接与其数组对象进行通信,但这不会导致KVO通知,因此没有其他人知道该属性的值已经更改。您可以在每次更改时自行发布KVO通知,但这很容易让人忘记。集合访问器和mutableArrayValueForKey:
是解决这些问题的两种方法:每次访问都是一行代码,会导致KVO通知。