1. 程式人生 > >KVC 鍵值程式設計的搜尋模式

KVC 鍵值程式設計的搜尋模式

鍵值屬性

是一種訪問屬性的鍵值對機制,其中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:預設的搜尋順序

  1. KVC從receiver([receiver massage])的類中查詢訪問方法set<Key>
  2. 如果set<Key>未找到,且receiver的類方法accessInstanceVariablesDirectly返回YES,則receiver依次搜尋名字為_<key>, _is<Key>, <key>, is<Key>,的例項變數,注意搜尋順序。
  3. 如果找到了訪問方法或者例項變數,則利用其設定對應的value。
  4. 如果既沒有搜尋到訪問方法,也沒有找到例項變數,則receiver會呼叫 setValue:forUndefinedKey: 方法

KVCsetValue搜尋順序

valueForKey:預設的搜尋模式

  1. 首先按get<Key>、<key>、is<Key>的順序查詢getter方法,找到直接呼叫。
    1. 若方法的返回結果型別為是一個物件指標,則直接返回結果;
    2. 若型別為能夠轉化為NSNumber的標量,做NSNumber轉換後返回;
    3. 否則,轉換為NSValue返回。
  2. 上面的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
    這幾個方法組合的形式呼叫。如果receiver的類實現了get<Key>:range:方法,給方法也會用於效能優化。
  3. 還沒查到,那麼查詢countOf<Key>、enumeratorOf<Key>、memberOf<Key>:格式的方法。如果這三個方法都找到,那麼就返回一個可以響應NSSet所有方法的集合代理(collection proxy object)。傳送給這個代理集合(collection proxy object)的NSSet訊息方法,就會以countOf<Key>、enumeratorOf<Key>、memberOf<Key>:組合的形式呼叫。
  4. 還是沒查到,那麼如果類方法accessInstanceVariablesDirectly返回YES,那麼按_<key>,_is<Key>,<key>,is<Key>(注意大小寫)的順序直接搜尋例項變數。如果搜尋到了,則返回receiver相應例項變數的值。返回結果的處理見步驟1。
  5. 再沒查到,呼叫valueForUndefinedKey:

流程圖有機會加上

有序集合的搜尋模式(NSMutableArray)

唯一有序集合(?)的搜尋模式()

無序集合的搜尋模式(NSMutableSet)