KVO,KVC

一. KVO是鍵值觀察,是Objective-C對觀察者模式的實現(xiàn)瓶佳,每次當被觀察者對象的某個屬性值發(fā)生改變時芋膘,注冊的觀察者便能獲得通知

二.原理:當觀察某對象A時,KVO機制動態(tài)創(chuàng)建一個對象A當前類的子類:NSKVONotifying_A霸饲,并為這個新的子類重寫了被觀察屬性keyPath的setter方法为朋。 setter方法隨后負責通知對象屬性的改變狀況.

在這個過程中,被觀察者對象的isa指針從指向原來的A類厚脉,被KVO機制修改為指向系統(tǒng)新創(chuàng)建的子類NSKVNitifying_A類习寸,來實現(xiàn)當前類屬性值改變的監(jiān)聽 ?

isa指針的作用:每個對象都有isa指針,指向該對象的類傻工,它告訴Runtime系統(tǒng)這個對象的類是什么霞溪。所以對象注冊為觀察者時,isa指針指向新子類中捆,那么這個被觀察的對象就變成新子類的對象鸯匹,因而在該對象上對setter的調(diào)用就會調(diào)用已重寫的setter,從而激活鍵盤值通知機制

KVO的鍵值觀察通知依賴于NSObject的兩個方法:willChangeValueForKey: 和 didChangeValueForKey?


三.方法

1.注冊觀察者泄伪,實施監(jiān)聽

[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];


其中person為被觀察者對象殴蓬,他的name屬性即為被觀察者的屬性

2.在回調(diào)方法中處理屬性發(fā)生的變化

- (void)observeValueForKeyPath:(NSString *)keyPath ?ofObject:(id)object change:(NSDictionary *)change ?context:(voidvoid *)context

{

NSString *name = [object valueForKey:@"name"];

NSLog(@"new name is: %@", name);

}


只要person對象中的name發(fā)生變化,系統(tǒng)會自動調(diào)用該方法

3.移除觀察者

-(void)dealloc

{

[person removeObserver:self forKeyPath:@"name"];


}

四.擴展

1.kvo與kvc不同

KVC (鍵值編碼)即key-value coding ,一個非正式的協(xié)議蟋滴,使用字符串(鍵)訪問一個對象實例變量的機制染厅。而不是通過調(diào)用setter getter 方法存取方式去訪問。 運用了isa-swizzling技術(shù)津函,isa-swizzling就是類型混合指針機制肖粮。

SEL數(shù)據(jù)類型:它是編譯器運行Objective-C里的方法的環(huán)境參數(shù)。

IMP數(shù)據(jù)類型:它其實就是一個編譯器內(nèi)部實現(xiàn)時候的函數(shù)指針尔苦。當Objective-C編譯器去處理實現(xiàn)一個方法的時候涩馆,就會指向一個IMP對象,這個對象是C語言表達的類型

KVC內(nèi)部實現(xiàn):(1)首先根據(jù)方法名找到運行方法的時候所需要的環(huán)境參數(shù)蕉堰。 (2)它會自己isa指針介乎環(huán)境參數(shù)凌净,找到具體的方法實現(xiàn)的接口。(3)再直接查找得來的具體的方法實現(xiàn)


KVO(鍵值監(jiān)聽)屋讶,即Key-Value Observing冰寻,它提供一種機制,當指定的對象的屬性被修改后,對象就會接受到通知,前提是執(zhí)行了setter方法皿渗、或者使用了KVC賦值斩芭。kvo是基于kvc實現(xiàn)的

2.和notification(通知)的區(qū)別轻腺?

notification比KVO多了發(fā)送通知的一步。

兩者都是一對多划乖,但是對象之間直接的交互贬养,notification明顯得多,需要notificationCenter來做為中間交互琴庵。而KVO如我們介紹的误算,設(shè)置觀察者->處理屬性變化,至于中間通知這一環(huán)迷殿,則隱秘多了儿礼,只留一句“交由系統(tǒng)通知”,具體的可參照以上實現(xiàn)過程的剖析庆寺。

3.與delegate的不同蚊夫?

和delegate一樣,KVO和NSNotification的作用都是類與類之間的通信懦尝。但是與delegate不同的是:

這兩個都是負責發(fā)送接收通知知纷,剩下的事情由系統(tǒng)處理,所以不用返回值陵霉;而delegate 則需要通信的對象通過變量(代理)聯(lián)系琅轧;

delegate一般是一對一,而這兩個可以一對多撩匕。

鏈接:http://blog.csdn.net/chy305chy/article/details/51793373 ? http://www.reibang.com/p/e59bb8f59302 ? ? ?http://www.reibang.com/p/37a92141077e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹰晨,一起剝皮案震驚了整個濱河市墨叛,隨后出現(xiàn)的幾起案子止毕,更是在濱河造成了極大的恐慌,老刑警劉巖漠趁,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扁凛,死亡現(xiàn)場離奇詭異,居然都是意外死亡闯传,警方通過查閱死者的電腦和手機谨朝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甥绿,“玉大人字币,你說我怎么就攤上這事」猜疲” “怎么了洗出?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長图谷。 經(jīng)常有香客問我翩活,道長阱洪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任菠镇,我火速辦了婚禮冗荸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘利耍。我一直安慰自己蚌本,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布隘梨。 她就那樣靜靜地躺著魂毁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪出嘹。 梳的紋絲不亂的頭發(fā)上席楚,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音税稼,去河邊找鬼烦秩。 笑死,一個胖子當著我的面吹牛郎仆,可吹牛的內(nèi)容都是我干的只祠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扰肌,長吁一口氣:“原來是場噩夢啊……” “哼抛寝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曙旭,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盗舰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后桂躏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钻趋,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年剂习,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛮位。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳞绕,死狀恐怖失仁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情们何,我是刑警寧澤萄焦,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站垂蜗,受9級特大地震影響楷扬,放射性物質(zhì)發(fā)生泄漏解幽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一烘苹、第九天 我趴在偏房一處隱蔽的房頂上張望躲株。 院中可真熱鬧,春花似錦镣衡、人聲如沸霜定。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽望浩。三九已至,卻和暖如春惰说,著一層夾襖步出監(jiān)牢的瞬間磨德,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工吆视, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留典挑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓啦吧,卻偏偏與公主長得像您觉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子授滓,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容