iPhone程式開發 KVO KVC實現機理分析

2021-06-22 08:01:15 字數 2119 閱讀 4252

iphone

程式開發kvo/kvc實現機理分析是本文要介紹的內容,不多說,直接進入話題。我們來看詳細內容。

objective-c裡面的key-value observing (kvo)機制,非常不錯,可以很好的減少澆水**。關於kvo的學習,可以參考文章:《key-value observing快速入門》:

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如何避免動態繫結,而獲得方法位址》:

這下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,那麼我們在內部就可以很容易的到觀察者登錄檔中去找到觀察者物件,而後給他傳送訊息。

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改變,用這種方式實現非常方便

iPhone開發之PXL格式程式開發

pxl是國內廣泛使用的一種ios程式安裝包,他只能安裝於破解版的iphone ipad等裝置上。和官方的ipa格式相比,pxl格式的程式有他獨特的特點。1 pxl與ipa格式優缺點比較 ipa作為蘋果官方的安裝包格式,顯然在先天上有他的優勢,他易於安裝和解除安裝,只要使用itunes就可以進行安裝 ...

iPhone程式開發 KVO KVC實現機理分析

iphone程式開發 kvo kvc實現機理分析是本文要介紹的內容,不多說,直接進入話題。我們來看詳細內容。objective c裡面的key value observing kvo 機制,非常不錯,可以很好的減少澆水 關於kvo的學習,可以參考文章 key value observing快速入門 ...

iPhone4高清屏程式開發

iphone4以前的機器螢幕解析度為320 480,iphone4直接翻了一倍640 960,好傢伙,要趕上我的膝上型電腦的解析度了。在這種解析度下,以往程式的一些元素不可避免地由於放大的緣故變得粗糙起來。不過ios的系統框架的那些按鈕字型導航等介面元素,可以自動適應iphone4的高畫質螢幕,也就...