kvo白热、kvc知識(shí)點(diǎn)總結(jié)

KVC和KVO

一、摘要

*1 KVO,即:Key-Value-Observing叨粘,它提供一種機(jī)制,當(dāng)指定的對(duì)象的屬性被修改后瘤睹,則觀察者就會(huì)接受到通知升敲。簡(jiǎn)單的說就是每次指定的被觀察的對(duì)象的屬性被修改后,KVO就會(huì)自動(dòng)通知相應(yīng)的觀察者了轰传。

*2 KVC是Key-Value-Coding的簡(jiǎn)稱驴党,它是一種可以直接通過字符串的名字(key)來訪問類屬性(實(shí)例變量)的機(jī)制。而不是通過調(diào)用Setter获茬、Getter方法訪問港庄。當(dāng)使用KVO倔既、Core Data、CocoaBindings鹏氧、AppleScript(Mac支持)時(shí)叉存,KVC是關(guān)鍵技術(shù)。

二度帮、作用

KVC作用一般是兩個(gè):字典轉(zhuǎn)模型 和 給私有的成員變量賦值

*1 字典轉(zhuǎn)模型

NSDictionary *dict=@{@"name":@"浩杰",@"age":@"18"};
Person *person=[Person new];
[person setValuesForKeysWithDictionary:dict];
NSLog(@"--%@---%@",person.name,person.age);

注意事項(xiàng):使用setValuesForKeysWithDictionary的時(shí)候歼捏,要保證字典的key的數(shù)量小于或者等于模型類,且key必須要和模型中的屬性名字相同笨篷,否則會(huì)出現(xiàn)錯(cuò)誤瞳秽。

*2 復(fù)雜的字典轉(zhuǎn)模型
如果一個(gè)模型類,其中一個(gè)屬性也是一個(gè)模型率翅,這種情況就需要給這個(gè)屬性傳入一個(gè)字典

NSDictionary *dict=@{@"name":@"浩杰",@"age":@"18",@"dog":@{@"name":@"tom",@"weight":@"10"}};
Person *person=[Person new];
[person setValuesForKeysWithDictionary:dict];

NSLog(@"----%@",person.dog);
 //    {
 //        name = tom;
 //        weight = 10;
//    }
person.dog=[Dog new]; //必須加這句話练俐,不加之前,查看打印結(jié)果會(huì)看到person.dog類型是字典冕臭;加之后打印結(jié)果是Dog
NSLog(@"----%@",person.dog);
//<Dog: 0x7fef69c01de0>

[person.dog setValuesForKeysWithDictionary:dict[@"dog"]];

注意事項(xiàng):當(dāng)給person對(duì)象發(fā)送setValuesForKeysWithDictionary消息的時(shí)候腺晾,實(shí)際上此時(shí)它的dog屬性指向一個(gè)字典,而不是Dog類的對(duì)象

*3 給私有的成員變量賦值

如果是在.h中定義了某個(gè)屬性辜贵,這是暴露給外界悯蝉,可以被訪問(public或者protect類型);如果是在.m中定義了某個(gè)屬性托慨,用KVC則同樣可以進(jìn)行賦值和取值操作鼻由。

Person *person=[Person new];
[person setValue:@"1.85" forKey:@"height"];
NSLog(@"--%@",[person valueForKey:@"height"]);

注意:屬性height是在.m文件中定義的; value的值一定是對(duì)象厚棵,所以即使person的私有成員變量是int類型的蕉世,但是setValue的時(shí)候要將其賦值為對(duì)象類型的。在進(jìn)行取值的時(shí)候也是一樣取出對(duì)象婆硬,使用NSNumber狠轻。

KVO 主要用來監(jiān)聽某個(gè)對(duì)象的某個(gè)屬性的變化,當(dāng)發(fā)生變化的時(shí)候彬犯,觀察者會(huì)調(diào)用對(duì)應(yīng)的函數(shù)向楼,實(shí)現(xiàn)對(duì)應(yīng)的功能

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

 //當(dāng)person的name發(fā)生變化的時(shí)候,self就會(huì)執(zhí)行下面的函數(shù)躏嚎,在該函數(shù)中實(shí)現(xiàn)相應(yīng)功能即可
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
  }

注意事項(xiàng):

//如果進(jìn)行了addobserver操作蜜自,那么就要進(jìn)行相應(yīng)的removeObserver操作。這是因?yàn)椋篴ddobserver操作卢佣,會(huì)在通知中心注冊(cè)監(jiān)聽者(這里是self)重荠,當(dāng)self這個(gè)對(duì)象銷毀后,如果沒有removeObserver虚茶,那么當(dāng)屬性改變時(shí)候戈鲁,仍然會(huì)給self這個(gè)已經(jīng)銷毀的對(duì)象發(fā)送屬性改變的消息仇参,因?yàn)樵谕ㄖ行闹校呀?jīng)銷毀的對(duì)象并沒有撤銷注冊(cè)
-(void)dealloc{
[self.person removeObserver:self forKeyPath:@"name"];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婆殿,一起剝皮案震驚了整個(gè)濱河市诈乒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婆芦,老刑警劉巖怕磨,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異消约,居然都是意外死亡肠鲫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門或粮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來导饲,“玉大人,你說我怎么就攤上這事氯材≡酰” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵氢哮,是天一觀的道長(zhǎng)袋毙。 經(jīng)常有香客問我,道長(zhǎng)命浴,這世上最難降的妖魔是什么娄猫? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任贱除,我火速辦了婚禮生闲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘月幌。我一直安慰自己碍讯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布扯躺。 她就那樣靜靜地躺著捉兴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪录语。 梳的紋絲不亂的頭發(fā)上倍啥,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音澎埠,去河邊找鬼虽缕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒲稳,可吹牛的內(nèi)容都是我干的氮趋。 我是一名探鬼主播伍派,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼剩胁!你這毒婦竟也來了诉植?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤昵观,失蹤者是張志新(化名)和其女友劉穎晾腔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啊犬,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡建车,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椒惨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缤至。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖康谆,靈堂內(nèi)的尸體忽然破棺而出领斥,到底是詐尸還是另有隱情,我是刑警寧澤沃暗,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布月洛,位于F島的核電站,受9級(jí)特大地震影響孽锥,放射性物質(zhì)發(fā)生泄漏嚼黔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一惜辑、第九天 我趴在偏房一處隱蔽的房頂上張望唬涧。 院中可真熱鬧,春花似錦盛撑、人聲如沸碎节。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狮荔。三九已至,卻和暖如春介粘,著一層夾襖步出監(jiān)牢的瞬間殖氏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工姻采, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雅采,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像总滩,于是被迫代替她去往敵國(guó)和親纲堵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • KVC(Key-value coding)鍵值編碼闰渔,單看這個(gè)名字可能不太好理解席函。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    黑暗中的孤影閱讀 49,741評(píng)論 74 441
  • KVC(Key-value coding)鍵值編碼冈涧,單看這個(gè)名字可能不太好理解茂附。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    Fendouzhe閱讀 675評(píng)論 0 6
  • KVC(Key-value coding)鍵值編碼督弓,單看這個(gè)名字可能不太好理解营曼。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    朽木自雕也閱讀 1,560評(píng)論 6 1
  • KVC/KVO 概念 KVC : 即 Key-Value-Coding愚隧,用于鍵值編碼蒂阱。作為 cocoa 的一個(gè)標(biāo)準(zhǔn)...
    滿臉胡茬的小碼農(nóng)閱讀 1,960評(píng)論 2 8
  • KVC簡(jiǎn)單介紹 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中狂塘,可以允許開發(fā)者通過Key...
    公子無禮閱讀 1,394評(píng)論 0 6