iPhone程序開發KVO/KVC實現機理分析是本文要介紹的內容,不多說,直接進入話題。我們來看詳細內容。
Objective-C裏面的Key-Value Observing (KVO)機制,非常不錯,可以很好的減少澆水代碼。關於KVO的學習,可以參考文章:《Key-Value Observing快速入門》:http://www.cocoadev.cn/Objective-C/Key-Value-Observing-Quick-Start-cn.asp
Key-Value Coding(KVC)實現分析
KVC運用了一個isa-swizzling技術。isa-swizzling就是類型混合指針機制。KVC主要通過isa-swizzling,來實現其內部查找定位的。isa指針,如其名稱所指,(就是is a kind of的意思),指向維護分發表的對象的類。該分發表實際上包含了指向實現類中的方法的指針,和其它數據。
比如說如下的一行KVC的代碼:
- [site setValue:@"sitename" forKey:@"name"];
就會被編譯器處理成:
- SEL sel = sel_get_uid ("setValue:forKey:");
- IMP method = objc_msg_lookup (site->isa,sel);
- method(site, sel, @"sitename", @"name");
首先介紹兩個基本概念:
(1)SEL數據類型:它是編譯器運行Objective-C裏的方法的環境參數。
(2)IMP數據類型:他其實就是一個 編譯器內部實現時候的函數指針。當Objective-C編譯器去處理實現一個方法的時候,就會指向一個IMP對象,這個對象是C語言表述的類型(事實上,在Objective-C的編譯器處理的時候,基本上都是C語言的)。
關於如何找到實現函數的指針,可參考文章:《Objective-C如何避免動態綁定,而獲得方法地址》:http://www.cocoadev.cn/Objective-C/Get-method-address.asp
這下KVC內部的實現就很清楚的清楚了:一個對象在調用setValue的時候,(1)首先根據方法名找到運行方法的時候所需要的環境參數。(2)他會從自己isa指針結合環境參數,找到具體的方法實現的接口。(3)再直接查找得來的具體的方法實現。
Key-Value Observing(KVO)實現
在上面所介紹的KVC機制上加上KVO的自動觀察消息通知機制就水到渠成了。
當觀察者爲一個對象的屬性進行了註冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一箇中間類,而不是真實的類。所以isa指針其實不需要指向實例對象真實的類。所以我們的程序最好不要依賴於isa指針。在調用類的方法的時候,最好要明確對象實例的類名。
熟悉KVO的朋友都知道,只有當我們調用KVC去訪問key值的時候KVO纔會起作用。所以肯定確定的是,KVO是基於KVC實現的。其實看了上面我們的分析以後,關係KVO的架構的構思也就水到渠成了。
因爲KVC的實現機制,可以很容易看到某個KVC操作的Key,而後也很容易的跟觀察者註冊表中的Key進行匹對。假如訪問的Key是被觀察的Key,那麼我們在內部就可以很容易的到觀察者註冊表中去找到觀察者對象,而後給他發送消息。
小結:iPhone程序開發 KVO/KVC實現機理分析的內容介紹完了,希望本文對你有所幫助。
KVC和KVO的使用原則:
一、KVC(key-value-coding)
1、只針對類屬性,設置鍵值對
2、設置setValue: forKey:,即forKey只能爲類屬性
3、取值valueForKey
二、KVO(key-value-observing)被觀察者的屬性發生改變時,通知觀察者
1、利用KVC對類屬性進行設置
2、註冊observing對象addObserver:forKeyPath:options:context:
3、觀察者類必須重寫方法 observeValueForKeyPath:ofObject:change:context:
4、應用,MVC模型中,數據庫(dataModal)發生變化時,引起view改變,用這種方式實現非常方便