消息機制,KVC,KVO

iOS 提供了一種 "同步的" 消息通知機制,觀察者只要向消息中心註冊, 便可接受其餘對象發送來的消息,消息發送者和消息接受者二者能夠互相一無所知,徹底解耦。設計模式

這種消息通知機制能夠應用於任意時間和任何對象,觀察者能夠有多個,因此消息具備廣播的性質,只是須要注意的是,觀察者向消息中心註冊之後,在不須要接受消息時須要向消息中心註銷,這種消息廣播機制是典型的「Observer」模式。服務器

這個要求其實也很容易實現. 每一個運行中的application都有一個NSNotificationCenter的成員變量,它的功能就相似公共欄. 對象註冊關注某個肯定的notification(若是有人撿到一隻小狗,就去告訴我). 咱們把這些註冊對象叫作 observer. 其它的一些對象會給center發送notifications(我撿到了一隻小狗). center將該notifications轉發給全部註冊對該notification感興趣的對象. 咱們把這些發送notification的對象叫作 poster架構

消息機制經常用於在向服務器端請求數據或者提交數據的場景,在和服務器端成功交互後,須要處理服務器端返回的數據,或發送響應消息等,就須要用到消息機制。app

 

KVC:Key-Value Coding,直譯是:鍵值編碼。簡單來說,就是給屬性設置值的;複雜來說,根據網上的說法,KVC運用了一個isa-swizzling技術。isa-swizzling就是類型混合指針機制。KVC主要經過isa-swizzling,來實現其內部查找定位的。isa指針,如其名稱所指,(就是is a kind of的意思),指向維護分發表的對象的類。該分發表實際上包含了指向實現類中的方法的指針,和其它數據。框架

好比說以下的第一行KVC的代碼,其實和第二行的普通代碼是等效的:post

[myClass setValue:@"daren" forKey:@"name"];ui

myClass._name = @"daren";編碼

KVC的代碼會被編譯器處理成:
 .net

SEL sel = sel_get_uid ("setValue:forKey:");
IMP method = objc_msg_lookup (myClass->isa,sel);
method(site, sel, @"daren", @"name");設計

 

這下KVC內部的實現就很清楚的清楚了:一個對象在調用setValue的時候:

a.  首先根據方法名找到運行方法的時候所須要的環境參數。

b.  它會從本身isa指針結合環境參數,找到具體的方法實現的接口。

c.  再直接查找得來的具體的方法實現。

 

Key-Value Observing (簡寫爲KVO):當指定的對象的屬性被修改了,容許對象接受到通知的機制。每次指定的被觀察對象的屬性被修改的時候,KVO都會自動的去通知相應的觀察者,至關於設計模式中的觀察者模式。

KVO的優勢:
當有屬性改變,KVO會提供自動的消息通知。這樣的架構有不少好處。首先,開發人員不須要本身去實現這樣的方案:每次屬性改變了就發送消息通知。這是KVO 機制提供的最大的優勢。由於這個方案已經被明肯定義,得到框架級支持,能夠方便地採用。開發人員不須要添加任何代碼,不須要設計本身的觀察者模型,直接可 以在工程裏使用。其次,KVO的架構很是的強大,能夠很容易的支持多個觀察者觀察同一個屬性,以及相關的值

相關文章
相關標籤/搜索