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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • KVC(Key-value coding)鍵值編碼,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    黑暗中的孤影閱讀 50,263評(píng)論 74 441
  • KVC(Key-value coding)鍵值編碼,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    Fendouzhe閱讀 733評(píng)論 0 6
  • KVC(Key-value coding)鍵值編碼,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    朽木自雕也閱讀 1,702評(píng)論 6 1
  • KVC/KVO 概念 KVC : 即 Key-Value-Coding,用于鍵值編碼。作為 cocoa 的一個(gè)標(biāo)準(zhǔn)...
    滿臉胡茬的小碼農(nóng)閱讀 2,088評(píng)論 2 8
  • KVC簡(jiǎn)單介紹 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允許開發(fā)者通過Key...
    公子無禮閱讀 1,525評(píng)論 0 6

友情鏈接更多精彩內(nèi)容