天天看點

KVC指派取值過程分析

前面我們簡單使用了KVC, 發現KVC能夠對私有的成員進行取值指派, 那麼KVC的指派取值的過程是什麼樣的?了解下..

指派過程

指派過程:

  • 先找相關方法 set<Key>:, _set<Key>:, setIs<Key>:
  • 若沒有相關方法 + (BOOL)accessInstanceVariablesDirectly,判斷是否可以直接方法成員變量
  • 如果是判斷是NO,直接執行KVC的setValue:forUNdefinedKey:(系統抛出一個異
  • 常,未定義key)
  • 如果是YES,繼續找相關變量_<key> _is<Key> <key> is<Key>
  • 方法或成員都不存在,setValue:

forUndefinedKey:方法,預設是抛出異常

驗證過程:

1. 先定義好方法和變量

KVC指派取值過程分析
KVC指派取值過程分析
KVC指派取值過程分析

2. 驗證:

先找相關方法,順序

set<Key>:, _set<Key>:, setIs<Key>:

KVC指派取值過程分析

判斷是否可以直接方法成員變量,系統預設傳回YES;

如果傳回NO, 直接抛異常!!

KVC指派取值過程分析
KVC指派取值過程分析

如果傳回YES

再找相關成員變量, 順序

_<key> _is<Key> <key> is<Key>

KVC指派取值過程分析
KVC指派取值過程分析

取值過程

指派過程:

  • 先找相關方法 get<Key>, key, countOfKey & objectInKeyAtIndex
  • 若沒有相關方法 + (BOOL)accessInstanceVariablesDirectly,判斷是否可以直接方法成員變量
  • 如果是判斷是NO,直接執行KVC的valueForUndefinedKey:(系統抛出一個異
  • 常,未定義key)
  • 如果是YES,繼續找相關變量_<key> ?_is<Key>? <key> ?is<Key>
  • 方法或成員都不存在,valueForUndefinedKey:方法,預設是抛出異常

驗證過程:

1. 先定義好方法和變量

KVC指派取值過程分析
KVC指派取值過程分析

2. 驗證開始

先找相關方法,順序

get<Key>, key, countOfKey & objectInKeyAtIndex

KVC指派取值過程分析

判斷是否可以直接方法成員變量,系統預設傳回YES;

如果傳回NO, 直接抛異常!!

KVC指派取值過程分析

如果傳回YES

再找相關成員變量, 順序

_<key> _is<Key> <key> is<Key>

KVC指派取值過程分析
KVC指派取值過程分析

KVC指派取值過程, 你學會了麼?

這是KVC系列的第二篇,下篇會繼續探究KVC, 敬請期待...