Dav*_*her 16 cocoa key-value-coding nsmutablearray
我试图更好地理解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;
Run Code Online (Sandbox Code Playgroud)
在Property中搜索Value(名为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;
Run Code Online (Sandbox Code Playgroud)接下来,它尝试这些无序的,多对多的getter(NSSet):
- (NSUInteger)countOfMyKey;
- (NSEnumerator *)enumeratorOfMyKey;
- (KeyClass *)memberOfMyKey:(KeyClass *)anObject;
Run Code Online (Sandbox Code Playgroud)接下来,它试图直接访问实例变量,假定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:, - removeFowerAtIndex:, - insert:atIndexes:和-removeAtIndexes:messages的某种组合.被发送到mutableArrayValueForKey的原始接收器:...等等...
这对我来说毫无意义,因为它正在讨论"setter"之类的方法. mutableArrayValueForKey:
返回一个NSMutableArray.上面列出的所有方法都返回void,用于编辑NSMutableArray,而不是获取它.例:
- (void)insertMyKey:(KeyClass *)keyObject inMyKeyAtIndex:(NSUInteger)index;
- (void)removeObjectFromMyKeyAtIndex:(NSUInteger)index;
Run Code Online (Sandbox Code Playgroud)
知道Apple试图在他们的文档中说什么,或者这可能是一个错误?
我的理论是,mutableArrayValueForKey:
它可能采取与valueForKey:
搜索KVC值时相似的路径.我只是不确定究竟是什么路径.
谢谢你尽你所能的帮助!:)
Bri*_*ter 21
在NSMutableArray
你打电话回来mutableArrayValueForKey:
实际上是一个私人的子类NSMutableArray
将覆盖正常的排列方法,如-count
,-objectAtIndex:
,-insertObject:atIndex:
,等,并要求将阵列从检索到的对象的相应的KVC方法.它基本上充当了操纵对象的多对多关系的代理,并且你不必担心创建或返回自己.一个简单的用法示例:
Playlist* aPlaylist;
Track* aTrack;
NSMutableArray* mutableTracks = [aPlaylist mutableArrayValueForKey:@"tracks"];
[mutableTracks insertObject:aTrack atIndex:0];
Run Code Online (Sandbox Code Playgroud)
这段代码在播放列表的开头添加了一个轨道.如果Playlist类为其"track"关系实现KVC方法,则在可变数组上调用方法将导致在底层对象上调用适当的方法.因此,在此示例中,当您调用insertObject:atIndex:
数组时,数组将依次调用insertObjectInTracks:atIndex:
播放列表对象,并且轨道将添加到播放列表的轨道数组中.
现在,在这个例子中,你当然可以直接调用insertObjectInTracks:atIndex:
,但是你可以使用几个优点mutableArrayValueForKey:
.
-tracks
和-setTracks:
,和上面的代码仍然可以工作.在这种情况下,insertObjectInTracks:atIndex:
可变数组代理不是调用,而是创建一个新数组,并在开头插入对象,然后只调用setTracks:
Playlist对象.这显然效率较低,因此通常建议实施完整的KVC方法列表.mutableArrayValueForKey:
允许您操纵关系而不必知道必须调用的方法的确切名称.只要对象与您正在使用的密钥符合KVC,一切都将"正常工作".NSMutableArray
自身实现的任何方法,例如,您可以使用在数组中搜索对象,对数组进行排序等的方法,而无需重写特殊版本来处理KVC内容. 归档时间: |
|
查看次数: |
4963 次 |
最近记录: |