人生就是一場戰斗
KVC(Key-Value Coding)鍵值編碼
1.1如何調用私有變量?如何修改系統的只讀屬性?KVC的查找順序?
KVC在某種程度上提供了訪問器的替代方案。但訪問器是個很好的東西,以至于KVC在都會在訪問器存在的情況下使用訪問器實現存取值。
待精深理解
為了設置或者返回對象屬性,KVC按順序使用如下技術:
①檢查是否存在-<key>、-is<key>(只針對布爾值有效)或者-get<key>的訪問器方法,如果有可能,就是用這些方法返回值;
檢查是否存在名為-set<key>:的方法,并使用它做設置值。對于 -get<key>和 -set<key>:方法,將大寫Key字符串的第一個字母,并與Cocoa的方法命名保持一致;
②如果上述方法不可用,則檢查名為-_<key>、-_is<key>(只針對布爾值有效)、-_get<key>和-set<key>:方法;
③如果沒有找到訪問器方法,可以嘗試直接訪問實例變量。實例變量可以是名為:<key>或<key>;
④如果仍為找到,則調用valueForUndefinedKey:和setValue:forUndefinedKey:方法。這些方法的默認實現都是拋出異常,我們可以根據需要重寫它們。
1.2什么是鍵-值,什么是鍵路徑?
模型的性質是通過一個簡單的鍵(通常是個字符串)來指定的。視圖和控制器通過鍵來查找相應的屬性值。在一個給定的實體中,同一個屬性的所有值具有相同的數據類型。鍵-值編碼技術用于進行這樣的查找—它是一種間接訪問對象屬性的機制。
鍵路徑是一個由用點作分隔符的鍵組成的字符串,用于指定一個連接在一起的對象性質序列。第一個鍵的性質是由先前的性質決定的,接下來每個鍵的值也是相對于其前面的性質。鍵路徑使您可以以獨立于模型實現的方式指定相關對象的性質。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相關對象的特定屬性。
1.3什么是KVC?什么是KVO?
KVC內部實現:一個對象調用setValue的時候:1首先根據方法名找打運行方法所需要的環境參數。2他會從自己isa指針結合環境參數,找到具體的方法實現的接口。3再直接查找得來的具體的方法實現。
KVO內部實現:當為某一個對象屬性注冊監聽的時候,該對象的isa指針就會指向一個中間類,而不是本來對象真實的類。所以說,對象的isa指針可以改變,我們的程序最好不要依賴isa指針。
1.4KVO的實現機制?
當某個類的對象在第一次被觀察時,系統會在運行時動態創建一個該類的派生類,在該派生類中重寫setter方法真正實現通知機制;派生類重寫了 class 方法以“欺騙”外部調用者它就是起初的那個類。然后系統將這個對象的isa指針指向這個新誕生的派生類,因此這個對象就成為該派生類的對象了,因而在該對象上對setter的調用就會調用重寫的setter,從而激活鍵值通知機制。此外,派生類還重寫了dealloc方法來釋放資源。
1.5KVO的使用場景
KVO用于監聽對象屬性的改變。
1下拉刷新、下拉加載監聽UIScrollView的contentoffsize;
2webview混排監聽contentsize;
3監聽模型屬性實時更新UI;
4監聽控制器frame改變,實現抽屜效果。
感謝@zzz。