前面我們簡單使用了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. 先定義好方法和變量
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5CeydzMitGe2gnMvwVM5YTOykjMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
2. 驗證:
先找相關方法,順序
set<Key>:, _set<Key>:, setIs<Key>:
判斷是否可以直接方法成員變量,系統預設傳回YES;
如果傳回NO, 直接抛異常!!
如果傳回YES
再找相關成員變量, 順序
_<key> _is<Key> <key> is<Key>
取值過程
指派過程:
- 先找相關方法 get<Key>, key, countOfKey & objectInKeyAtIndex
- 若沒有相關方法 + (BOOL)accessInstanceVariablesDirectly,判斷是否可以直接方法成員變量
- 如果是判斷是NO,直接執行KVC的valueForUndefinedKey:(系統抛出一個異
- 常,未定義key)
- 如果是YES,繼續找相關變量_<key> ?_is<Key>? <key> ?is<Key>
- 方法或成員都不存在,valueForUndefinedKey:方法,預設是抛出異常
驗證過程:
1. 先定義好方法和變量
2. 驗證開始
先找相關方法,順序
get<Key>, key, countOfKey & objectInKeyAtIndex
判斷是否可以直接方法成員變量,系統預設傳回YES;
如果傳回NO, 直接抛異常!!
如果傳回YES
再找相關成員變量, 順序
_<key> _is<Key> <key> is<Key>
KVC指派取值過程, 你學會了麼?
這是KVC系列的第二篇,下篇會繼續探究KVC, 敬請期待...