人生就是一場(chǎng)戰(zhàn)斗
KVC(Key-Value Coding)鍵值編碼
1.1如何調(diào)用私有變量纠炮?如何修改系統(tǒng)的只讀屬性?KVC的查找順序杨幼?
KVC在某種程度上提供了訪問器的替代方案撇簿。但訪問器是個(gè)很好的東西聂渊,以至于KVC在都會(huì)在訪問器存在的情況下使用訪問器實(shí)現(xiàn)存取值。
待精深理解
為了設(shè)置或者返回對(duì)象屬性四瘫,KVC按順序使用如下技術(shù):
①檢查是否存在-<key>汉嗽、-is<key>(只針對(duì)布爾值有效)或者-get<key>的訪問器方法,如果有可能找蜜,就是用這些方法返回值饼暑;
檢查是否存在名為-set<key>:的方法,并使用它做設(shè)置值洗做。對(duì)于 -get<key>和 -set<key>:方法弓叛,將大寫Key字符串的第一個(gè)字母,并與Cocoa的方法命名保持一致诚纸;
②如果上述方法不可用撰筷,則檢查名為-_<key>、-_is<key>(只針對(duì)布爾值有效)畦徘、-_get<key>和-set<key>:方法毕籽;
③如果沒有找到訪問器方法,可以嘗試直接訪問實(shí)例變量井辆。實(shí)例變量可以是名為:<key>或<key>;
④如果仍為找到关筒,則調(diào)用valueForUndefinedKey:和setValue:forUndefinedKey:方法。這些方法的默認(rèn)實(shí)現(xiàn)都是拋出異常杯缺,我們可以根據(jù)需要重寫它們蒸播。
1.2什么是鍵-值,什么是鍵路徑夺谁?
模型的性質(zhì)是通過一個(gè)簡(jiǎn)單的鍵(通常是個(gè)字符串)來指定的廉赔。視圖和控制器通過鍵來查找相應(yīng)的屬性值。在一個(gè)給定的實(shí)體中匾鸥,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對(duì)象屬性的機(jī)制碉纳。
鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串勿负,用于指定一個(gè)連接在一起的對(duì)象性質(zhì)序列。第一個(gè)鍵的性質(zhì)是由先前的性質(zhì)決定的劳曹,接下來每個(gè)鍵的值也是相對(duì)于其前面的性質(zhì)奴愉。鍵路徑使您可以以獨(dú)立于模型實(shí)現(xiàn)的方式指定相關(guān)對(duì)象的性質(zhì)。通過鍵路徑铁孵,您可以指定對(duì)象圖中的一個(gè)任意深度的路徑锭硼,使其指向相關(guān)對(duì)象的特定屬性。
1.3什么是KVC?什么是KVO蜕劝?
KVC內(nèi)部實(shí)現(xiàn):一個(gè)對(duì)象調(diào)用setValue的時(shí)候:1首先根據(jù)方法名找打運(yùn)行方法所需要的環(huán)境參數(shù)檀头。2他會(huì)從自己isa指針結(jié)合環(huán)境參數(shù)轰异,找到具體的方法實(shí)現(xiàn)的接口。3再直接查找得來的具體的方法實(shí)現(xiàn)暑始。
KVO內(nèi)部實(shí)現(xiàn):當(dāng)為某一個(gè)對(duì)象屬性注冊(cè)監(jiān)聽的時(shí)候搭独,該對(duì)象的isa指針就會(huì)指向一個(gè)中間類,而不是本來對(duì)象真實(shí)的類廊镜。所以說牙肝,對(duì)象的isa指針可以改變,我們的程序最好不要依賴isa指針嗤朴。
1.4KVO的實(shí)現(xiàn)機(jī)制配椭?
當(dāng)某個(gè)類的對(duì)象在第一次被觀察時(shí),系統(tǒng)會(huì)在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建一個(gè)該類的派生類雹姊,在該派生類中重寫setter方法真正實(shí)現(xiàn)通知機(jī)制股缸;派生類重寫了 class 方法以“欺騙”外部調(diào)用者它就是起初的那個(gè)類。然后系統(tǒng)將這個(gè)對(duì)象的isa指針指向這個(gè)新誕生的派生類容为,因此這個(gè)對(duì)象就成為該派生類的對(duì)象了乓序,因而在該對(duì)象上對(duì)setter的調(diào)用就會(huì)調(diào)用重寫的setter,從而激活鍵值通知機(jī)制坎背。此外替劈,派生類還重寫了dealloc方法來釋放資源。
1.5KVO的使用場(chǎng)景
KVO用于監(jiān)聽對(duì)象屬性的改變得滤。
1下拉刷新陨献、下拉加載監(jiān)聽UIScrollView的contentoffsize;
2webview混排監(jiān)聽contentsize懂更;
3監(jiān)聽模型屬性實(shí)時(shí)更新UI眨业;
4監(jiān)聽控制器frame改變,實(shí)現(xiàn)抽屜效果沮协。
感謝@zzz龄捡。