我試圖理解Cocoa的Key-Value Coding(KVC)機制好一點。我讀過蘋果公司的Key-Value Programming Guide,但我仍然對某些KVC方法如何搜索密鑰感到困惑。特別是,mutableArrayValueForKey:。什麼是mutableArrayValueForKey的KVC搜索模式?
下面我將解釋我如何理解valueForKey:
KVC「getters」的工作。然後我會回到我關於mutableArrayValueForKey的問題。
有七種不同的 「吸氣劑」 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),蘋果的文檔指出valueForKey:搜索這樣的:
- 試圖
-getMyKey
,-myKey
和-isMyKey
(在接收機內部的順序) 如果沒有找到,它會嘗試這些命令,對許多幹將(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;
接下來,它會嘗試這些無序的,對許多幹將(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:methods)。 如果至少一個插入方法和 至少一種去除方法被發現 每個的NSMutableArray消息發送到 收集代理對象將 結果在 -insertObject的一些組合:inAtIndex :, -removeObjectFromAtIndex :, -insert:atIndexes: ,以及-removeAtIndexes:發送到 mutableArrayValueForKey:的原始接收者的消息。 ...等...
這對我來說沒有任何意義,因爲它正在討論類似方法的「setter」。 mutableArrayValueForKey:
返回一個NSMutableArray。上面列出的所有方法都返回void,並用於編輯NSMutableArray,而不是它。例如:
- (void)insertMyKey:(KeyClass *)keyObject inMyKeyAtIndex:(NSUInteger)index;
- (void)removeObjectFromMyKeyAtIndex:(NSUInteger)index;
任何想法蘋果試圖說在他們的文檔,或者如果這可能是一個錯誤?
我的理論是mutableArrayValueForKey:
很有可能在搜索檢索KVC值時採取與valueForKey:
類似的路徑。我只是不確定真正的路徑。
感謝您提供的任何幫助! :)
感謝Brian,這非常有幫助。 :) – 2010-02-19 17:12:04
「這段代碼添加了一首曲目到播放列表的開頭」,我認爲它在曲目的開頭添加了一首曲目,而不是播放列表? – 2010-09-03 08:41:35
與使用綁定時相關的這種方法是相關的。在上面的例子中,如果Playlist是綁定到tracks數組的NSArrayController,並且我們有一個綁定到這個控制器的NSTableView,那麼爲了通過數組控制器將軌道上的變化反映到表中,我們必須從mutable數組代理,然後在該軌道上添加/刪除對象:事實上,這些操作將反映到將觸發綁定機制的KVC命令。 – viggio24 2011-10-04 19:26:39