【发布时间】:2016-05-30 21:57:42
【问题描述】:
我正在尝试更好地理解 Cocoa 的键值编码 (KVC) 机制。我已经阅读了 Apple 的 Key-Value Programming Guide,但对于某些 KVC 方法如何搜索密钥仍然有些困惑。特别是 mutableArrayValueForKey:.
下面我将解释我是如何理解valueForKey: KVC“getters”工作的。然后我会回答关于 mutableArrayValueForKey 的问题。
有七种不同的“getter”KVC 方法:
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
在属性(名为 myKey)中搜索值时,Apple 的文档声明 valueForKey: 搜索如下:
- 在接收器内部尝试
-getMyKey、-myKey和-isMyKey(按此顺序) -
如果没有找到,它会尝试这些有序的、对多的 getter (NSArray):
// Required: - (NSUInteger)countOfMyKey; // Requires At Least One: - (id)objectInMyKeyAtIndex:(NSUInteger)index; - (NSArray *)myKeyAtIndexes:(NSIndexSet *)indexes; // Optional (improves performance): - (void)getMyKey:(KeyClass **)buffer range:(NSRange)inRange; -
接下来,它会尝试这些无序的、对多的 getter (NSSet):
- (NSUInteger)countOfMyKey; - (NSEnumerator *)enumeratorOfMyKey; - (KeyClass *)memberOfMyKey:(KeyClass *)anObject; 接下来,它尝试直接访问实例变量,假设
YES由accessInstanceVariablesDirectly返回,顺序为:_myKey、_isMyKey、myKey、isMyKey。最后放弃并调用接收类的
- (id)valueForUndefinedKey:(NSString *)key方法。通常这里会报错。
我的问题是,mutableArrayValueForKey: 的搜索顺序模式是什么?
有序的访问器搜索模式 收藏
默认搜索模式 mutableArrayValueForKey: 是 如下:
在接收者的类中搜索一个 名称匹配的方法对 模式 -insertObject:inAtIndex: 和-removeObjectFromAtIndex: (对应于 NSMutableArray 原始方法 insertObject:atIndex: 和 removeObjectAtIndex:分别),或 匹配模式的方法 -insert:atIndexes: 和 -removeAtIndexes: (对应于 NSMutableArrayinsertObjects:atIndexes: 和 removeObjectsAtIndexes:方法)。 如果至少一种插入方法和 至少找到一种移除方法 每个 NSMutableArray 消息发送到 集合代理对象将 导致某种组合 -insertObject:inAtIndex:, -removeObjectFromAtIndex:, -insert:atIndexes:, 和 -removeAtIndexes: 发送到原始接收者的消息 mutableArrayValueForKey:. ...等等...
这对我来说毫无意义,因为它正在讨论类似“setter”的方法。 mutableArrayValueForKey: 返回一个 NSMutableArray。上面列出的所有方法都返回 void,并用于编辑 NSMutableArray,而不是获取它。示例:
- (void)insertMyKey:(KeyClass *)keyObject inMyKeyAtIndex:(NSUInteger)index;
- (void)removeObjectFromMyKeyAtIndex:(NSUInteger)index;
知道 Apple 试图在他们的文档中说什么,或者这可能是一个错误吗?
我的理论是,mutableArrayValueForKey: 在搜索 KVC 值时可能会采用与 valueForKey: 类似的路径。我只是不确定那到底是什么路径。
感谢您提供的任何帮助! :)
【问题讨论】:
标签: cocoa nsmutablearray key-value-coding