iOS KVC KVO KVB

來源:互聯網
上載者:User

 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語言的)。

這下KVC內部的實現就很清楚的清楚了:一個對象在調用setValue的時候,(1)首先根據方法名找到運行方法的時候所需要的環境參 數。(2)他會從自己isa指標結合環境參數,找到具體的方法實現的介面。(3)再直接尋找得來的具體的方法實現。

Key-Value Observing機制的概述

Key-Value Observing (簡寫為KVO):當指定的對象的屬性被修改了,允許對象接受到通知的機制。每次指定的被觀察對象的屬性被修改的時候,KVO都會自動的去通知相應的觀察 者。

KVO的優點

當有屬性改變,KVO會提供自動的訊息通知。這樣的架構有很多好處。首先,開發人員不需要自己去實現這樣的方案:每次屬性改變了就發送訊息通知。這 是KVO機制提供的最大的優點。因為這個方案已經被明確定義,獲得架構級支援,可以方便地採用。開發人員不需要添加任何代碼,不需要設計自己的觀察者模 型,直接可以在工程裡使用。其次,KVO的架構非常的強大,可以很容易的支援多個觀察者觀察同一個屬性,以及相關的值。


KVB
兩個基本方法
1:為對象添加觀察者OBserver
addObserver:forKeyPath:options:context: 

2:觀察者OBserver收到資訊的處理函數
observeValueForKeyPath:ofObject:change:context: 






MVC架構是"Model-View-Controller"的縮寫,中文翻譯為"模式-視圖-控制器"。MVC應用程式總是由這三個部分組成。 Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要Controller改變了Models的資料或者屬性, 所有依賴的View都會自動更新。類似的,只要Controller改變了View,View會從潛在的Model中擷取資料來重新整理自己。

  MVC架構最早是smalltalk語言研究團提出的,應用於使用者互動應用程式中。

  MVC模式是一個複雜的架構模式,其實現也顯得非常複雜。但是,我們已經總結出了很多可靠的設計模式,多種設計模式結合在一起,使MVC模式的 實現變得相對簡單易行。Views可以看作一棵樹,顯然可以用Composite Pattern來實現。Views和Models之間的關係可以用Observer Pattern體現。Controller控制Views的顯示,可以用Strategy Pattern實現。Model通常是一個調停者,可採用Mediator
Pattern來實現。


KVC--KVO--KVB優勢
些機制通過規定了一組通用的Cocoa命名法則、調用規則等,實現了如下功能:

   1. 使用一對高度正常化的存取方法,擷取以及設定任何對象的任何屬性的值(所謂的屬性既可以是個實實在在的成員變數,也可以是通過一對成員方法所抽象出的該對 象的一個性質)。   2. 通過繼承一個特定的方法,並且指定希望監視的對象及希望監視的屬性名稱,就能在該對象的指定屬性的值發生改變時,得到一個“通知”(儘管這不是一個真正意 義上的通知),並且得到相關屬性的值的變化(原先的值和改變後的新值)。   3. 通過一個簡單的函數調用,使一個視圖對象的一個指定屬性隨時隨地都和一個控制器對象或模型對象的一個指定屬性保持同步。

在很多時候接觸到很多地方都有對KVC,KVO的描述,但是都是一筆帶過.只知道這是Object-C提供的一個不錯的機制,可以很好的減少澆水代碼。

 

其實KVC、KVO即NSKeyValueCoding和NSKeyValueCoding的簡稱。

在官方文檔中描述為

 

那我們KVO、KVC用來做什麼的我們又怎麼使用它呢?

 

首先我們先瞭解下KVO的機制

KVO:當指定的對象的屬性被修改了,允許對象接收到通知的機制。每當在類中定義一個監聽

如:

[self addObserver:self

  forKeyPath:@"items"

  options:0

  context:contexStr];

***

當然你還可以監聽其他對象的屬性變化

[person addObserver:money

  forKeyPath:@"account"

  options:0

  context:contexStr];

****

只要當前類中items這個屬性發生的變化都會觸發到以下的方法。

- (void)observeValueForKeyPath:(NSString *)keyPath

ofObject:(id)object

change:(NSDictionary *)change

context:(void *)context

 

KVO的優點:

當有屬性改變,KVO會提供自動的訊息通知。這樣開發人員不需要自己去實現這樣的方案:每次屬性改變了就發送訊息通知。

這是KVO機制提供的最大的優點。因為這個方案已經被明確定義,獲得架構級支援,可以方便地採用。

開發人員不需要添加任何代碼,不需要設計自己的觀察者模型,直接可以在工程裡使用。

其次,KVO的架構非常的強大,可以很容易的支援多個觀察者觀察同 一個屬性,以及相關的值。

 

KVC的實現分析

KVC運用了一個isa-swizzling技術。

isa-swizzling就是類型混合指標機制。KVC主要通過isa-swizzling,來實現其內部尋找定位的。

isa指標,就是is
a kind of的意思,指向維護分發表的對象的類。該分發表實際上包含了指向實作類別中的方法的指標,和其它資料。

如下KVC的代碼:

[person setValue:@"personName" forKey:@"name"];

 

就會被編譯器處理成:

SEL sel = sel_get_uid ("setValue:forKey:");

IMP method = objc_msg_lookup (person->isa,sel);

method(person, sel, @"personName", @"name");

***

其中:

SEL資料類型:它是編譯器運行Objective-C裡的方法的環境參數。

IMP資料類型:他其實就是一個 編譯器內部實現時候的函數指標。當Objective-C編譯器去處理實現一個方法的時候,就會指向一個IMP對象,這個對象是C語言表述的類型。

***

KVC在調用方法setValue的時候

(1)首先根據方法名找到運行方法的時候所需要的環境參數。

(2)他會從自己isa指標結合環境參數,找到具體的方法實現的介面。

(3)再直接尋找得來的具體的方法實現。

 

這樣的話前面介紹的KVO實現就好理解了

當一個對象註冊了一個觀察者,被觀察對象的isa指標被修改的時候,isa指標就會指向一個中間類,而不是真實的類。

所以isa指標其實不需要指向執行個體對象真實的類。所以我們的程式最好不要依賴於isa指標。在調用類的方法的時候,最好要明確對象執行個體的類名。

這樣只有當我們調用KVC去訪問key值的時候KVO才會起作用。所以肯定確定的是,KVO是基於KVC實現的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.