KVC 鍵值程式設計的搜尋模式
阿新 • • 發佈:2019-02-07
鍵值屬性
是一種訪問屬性的鍵值對機制,其中key是屬性的名稱,value是屬性的值。
- 通過KVC可以減少程式碼量,在需要根據變數訪問指定屬性時尤其如此。
- 降低耦合性。
Key-value coding attempts to use accessor methods to get and set values, before resorting to directly accessing the instance variable.
KVC會首先嚐試使用accessor methods(getter/setter)方法來訪問屬性的值,若未找到,然後才是直接訪問例項變數(instance variable)。
簡單屬性的搜尋模式
setValue:forKey:預設的搜尋順序
- KVC從receiver(
[receiver massage]
)的類中查詢訪問方法set<Key>
。 - 如果
set<Key>
未找到,且receiver的類方法accessInstanceVariablesDirectly返回YES,則receiver依次搜尋名字為_<key>, _is<Key>, <key>, is<Key>,
的例項變數,注意搜尋順序。 - 如果找到了訪問方法或者例項變數,則利用其設定對應的value。
- 如果既沒有搜尋到訪問方法,也沒有找到例項變數,則receiver會呼叫 setValue:forUndefinedKey: 方法
valueForKey:預設的搜尋模式
- 首先按
get<Key>、<key>、is<Key>
的順序查詢getter方法,找到直接呼叫。
- 若方法的返回結果型別為是一個物件指標,則直接返回結果;
- 若型別為能夠轉化為NSNumber的標量,做NSNumber轉換後返回;
- 否則,轉換為NSValue返回。
- 上面的getter沒有找到,查詢
countOf<Key>、objectIn<Key>AtIndex:、<Key>AtIndexes
格式的方法。
如果countOf<Key>
和另外兩個方法中的一個找到,那麼就會返回一個可以響應NSArray所有方法的集合代理(collection proxy object)。傳送給這個代理集合(collection proxy object)的NSArray訊息方法,就會以countOf<Key>、objectIn<Key>AtIndex:、<Key>AtIndexes
get<Key>:range:
方法,給方法也會用於效能優化。 - 還沒查到,那麼查詢
countOf<Key>、enumeratorOf<Key>、memberOf<Key>:
格式的方法。如果這三個方法都找到,那麼就返回一個可以響應NSSet所有方法的集合代理(collection proxy object)。傳送給這個代理集合(collection proxy object)的NSSet訊息方法,就會以countOf<Key>、enumeratorOf<Key>、memberOf<Key>:
組合的形式呼叫。 - 還是沒查到,那麼如果類方法accessInstanceVariablesDirectly返回YES,那麼按
_<key>,_is<Key>,<key>,is<Key>
(注意大小寫)的順序直接搜尋例項變數。如果搜尋到了,則返回receiver相應例項變數的值。返回結果的處理見步驟1。 - 再沒查到,呼叫
valueForUndefinedKey:
。
流程圖有機會加上