KVC和KVO

KVC

鍵值編碼(Key-Value Coding)是Cocoa的一個(gè)特性,它允許你通過(guò)對(duì)象名設(shè)置和獲取對(duì)象的值。

KVC特性

  • 如果嘗試給一個(gè)并不存在于你定義的類的鍵設(shè)置一個(gè)值,該KVC系統(tǒng)將會(huì)拋出一個(gè)異常,因?yàn)檫\(yùn)行時(shí)不知道將該值存儲(chǔ)在哪里。
  • 在KVC中沒有訪問(wèn)保護(hù),當(dāng)私有變量被訪問(wèn)時(shí),KVC依然有效。

KVC不是旨在更換訪問(wèn)方法,而是提供一個(gè)更為靈活的方式設(shè)置和獲取對(duì)象的值。

KVO

在MVC模式下,控制器如何得知何時(shí)更新視圖?有兩種選項(xiàng):

  1. 反復(fù)檢查模型,觀察是否有任何更改。
  2. 等待模型向控制器發(fā)送通知。

第一種選項(xiàng)的實(shí)現(xiàn)最簡(jiǎn)單,創(chuàng)建一個(gè)定時(shí)器,定期獲取模型中的最新值,并將其提供給視圖。(浪費(fèi)CPU資源)

要解決此問(wèn)題,Cocoa提供了一種功能,KVO。KVO允許對(duì)象注冊(cè)為當(dāng)另一個(gè)對(duì)象更改它的一個(gè)屬性的值時(shí)收到通知。

KVO有助于簡(jiǎn)化注冊(cè)通知的過(guò)程以及通知任何需要被告知變化的對(duì)象。任何對(duì)象的任何屬性都可以被觀察,只要該屬性的名稱符合KVO。(前提是執(zhí)行了setter方法或者使用了KVC賦值)。

添加觀察者:

[self.model addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

當(dāng)屬性發(fā)生變化時(shí),系統(tǒng)會(huì)回調(diào)該方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"title"] && (object == self.model)) {
    // 獲取新值,更新label。
    
        NSString *newTitle = [change objectForKey:NSKeyValueChangeNewKey];
        self.textLabel.text = newTitle;
        
        NSString *oldTitle = [change objectForKey:NSKeyValueChangeOldKey];
        NSLog(@"%@", oldTitle);
    }
}

另外,如果不使用OC屬性,或者重寫了一個(gè)屬性的setter方法,則需要手動(dòng)通知系統(tǒng)所做的更改。

- (void)setTitle:(NSString *)title {
    [self willChangeValueForKey:@"title"];
    _title = title;
    [self didChangeValueForKey:@"title"];
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,637評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,629評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,976評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評(píng)論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,139評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,686評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,411評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,641評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,820評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,362評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,604評(píng)論 2 380

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

  • 在編程中,最常見的就是程序的流程取決于你所使用的各種變量和屬性的值,根據(jù)變量和屬性的值確定后面運(yùn)行的代碼,有時(shí)會(huì)檢...
    pro648閱讀 1,655評(píng)論 2 27
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/05/12/objective-czh...
    F麥子閱讀 985評(píng)論 0 0
  • 本文講述了使用Cocoa框架中的KVC和KVO,實(shí)現(xiàn)觀察者模式 鍵/值編碼中的基本調(diào)用包括-valueForKey...
    茗涙閱讀 703評(píng)論 0 3
  • 目錄:1.KVC用法;2.KVC和對(duì)象的setter、getter方法的區(qū)別;3.key和keyPath的區(qū)別;4...
    倫倫子_f7b3閱讀 585評(píng)論 0 1
  • 什么是KVC和KVO??jī)烧咧g有何關(guān)系 KVC : 鍵值編碼,是Key Value Coding 的簡(jiǎn)稱,coco...
    蘭章海晏閱讀 3,596評(píng)論 0 3