KVO 和 KVC 理解

?一跛锌,概述

KVO,即:Key-Value Observing气笙,它提供一種機(jī)制梁剔,當(dāng)指定的對(duì)象的屬性被修改后,則對(duì)象就會(huì)接受到通知哟旗。簡(jiǎn)單的說(shuō)就是每次指定的被觀察的對(duì)象的屬性被修改后贩据,KVO就會(huì)自動(dòng)通知相應(yīng)的觀察者了。

二闸餐,使用方法

系統(tǒng)框架已經(jīng)支持KVO饱亮,所以程序員在使用的時(shí)候非常簡(jiǎn)單。

1. 注冊(cè)舍沙,指定被觀察者的屬性近上,

2. 實(shí)現(xiàn)回調(diào)方法

3. 移除觀察

三,實(shí)例:

假設(shè)一個(gè)場(chǎng)景,股票的價(jià)格顯示在當(dāng)前屏幕上拂铡,當(dāng)股票價(jià)格更改的時(shí)候壹无,實(shí)時(shí)顯示更新其價(jià)格葱绒。

1.定義DataModel,

[cpp] view plaincopy

@interface StockData : NSObject {

NSString * stockName;

float price;

}

@end

@implementation StockData

@end

2.定義此model為Controller的屬性斗锭,實(shí)例化它地淀,監(jiān)聽(tīng)它的屬性,并顯示在當(dāng)前的View里邊

[cpp] view plaincopy

- (void)viewDidLoad

{

[super viewDidLoad];

stockForKVO = [[StockData alloc] init];

[stockForKVO setValue:@"searph" forKey:@"stockName"];

[stockForKVO setValue:@"10.0" forKey:@"price"];

[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];

myLabel.textColor = [UIColor redColor];

myLabel.text = [stockForKVO valueForKey:@"price"];

[self.view addSubview:myLabel];

UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];

b.frame = CGRectMake(0, 0, 100, 30);

[b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:b];

}

3.當(dāng)點(diǎn)擊button的時(shí)候岖是,調(diào)用buttonAction方法骚秦,修改對(duì)象的屬性

[cpp] view plaincopy

-(void) buttonAction

{

[stockForKVO setValue:@"20.0" forKey:@"price"];

}

4. 實(shí)現(xiàn)回調(diào)方法

[cpp] view plaincopy

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

{

if([keyPath isEqualToString:@"price"])

{

myLabel.text = [stockForKVO valueForKey:@"price"];

}

}

5.增加觀察與取消觀察是成對(duì)出現(xiàn)的,所以需要在最后的時(shí)候璧微,移除觀察者

[cpp] view plaincopy

- (void)dealloc

{

[super dealloc];

[stockForKVO removeObserver:self forKeyPath:@"price"];

[stockForKVO release];

}

四作箍,小結(jié)

KVO這種編碼方式使用起來(lái)很簡(jiǎn)單,很適用與datamodel修改后前硫,引發(fā)的UIVIew的變化這種情況胞得,就像上邊的例子那樣,當(dāng)更改屬性的值后屹电,監(jiān)聽(tīng)對(duì)象會(huì)立即得到通知阶剑。

KVC

一,概述

KVC是KeyValueCoding的簡(jiǎn)稱危号,它是一種可以直接通過(guò)字符串的名字(key)來(lái)訪問(wèn)類屬性(實(shí)例變量)的機(jī)制牧愁。而不是通過(guò)調(diào)用Setter、Getter方法訪問(wèn)外莲。

當(dāng)使用KVO猪半、Core Data、CocoaBindings偷线、AppleScript(Mac支持)時(shí)磨确,KVC是關(guān)鍵技術(shù)。

二声邦,使用方法

關(guān)鍵方法定義在:NSKeyValueCodingprotocol

KVC支持類對(duì)象和內(nèi)建基本數(shù)據(jù)類型乏奥。

獲取值

valueForKey:,傳入NSString屬性的名字亥曹。

valueForKeyPath:邓了,傳入NSString屬性的路徑,xx.xx形式媳瞪。

valueForUndefinedKey它的默認(rèn)實(shí)現(xiàn)是拋出異常骗炉,可以重寫這個(gè)函數(shù)做錯(cuò)誤處理。

修改值

setValue:forKey:

setValue:forKeyPath:

setValue:forUndefinedKey:

setNilValueForKey:當(dāng)對(duì)非類對(duì)象屬性設(shè)置nil時(shí)材失,調(diào)用痕鳍,默認(rèn)拋出異常。

一對(duì)多關(guān)系成員的情況

mutableArrayValueForKey:有序一對(duì)多關(guān)系成員? NSArray

mutableSetValueForKey:無(wú)序一對(duì)多關(guān)系成員? NSSet

三,實(shí)例:

1.? ? 1 .Person類

2.? ? @implementation Person

3.? ? @synthesize name,age;//屬性name 將被監(jiān)視

4.? ? -(void) changeName

5.? ? {

6.? ? ? ? name=@”changeName directly”;

7.? ? }

8.? ? @end

9.

10.

11. 2.PersonMonitor類? 監(jiān)視了name屬性

12. @implementation PersonMonitor

13.

14. – (void)observeValueForKeyPath:(NSString *)keyPath

15.? ? ? ? ? ? ? ? ? ? ? ofObject:(id)object

16.? ? ? ? ? ? ? ? ? ? ? ? change:(NSDictionary *)change

17.? ? ? ? ? ? ? ? ? ? ? ? context:(void *)context

18. {

19.? ? if ([keyPath isEqual:@"name"])

20.? ? {

21.? ? ? ? NSLog(@”change happen, old:%@? new:%@”,[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);

22.? ? }

23. }

24. @end

25.

26.

27. 3測(cè)試代碼

28.

29.? ? //初始化被監(jiān)視對(duì)象

30.? ? Person *p =[[Person alloc] init];

31.? ? //監(jiān)視對(duì)象

32.? ? PersonMonitor *pm= [[PersonMonitor alloc]init];

33.? ? [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil];

34.

35. //測(cè)試前的數(shù)據(jù)

36.? ? NSLog(@”p.name is %@”,p.name);

37.

38. //通過(guò)setvalue 的方法笼呆,PersonMonitor的監(jiān)視將被調(diào)用

39.? [p setValue:@"name kvc" forKey:@"name"];

40.

41. //查看設(shè)置后的值

42.? ? NSLog(@”p name get by kvc is %@”,[p valueForKey:@"name"]);

43.

44. //效果和通過(guò)setValue 是一致的

45. p.name=@”name change by .name=”;

46.

47.? //通過(guò)person自己的函數(shù)來(lái)更改name

48.? ? ? [p changeName];

49.

50.? 結(jié)果是

51. 輸出

52. 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name

53. 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name? new:name kvc

54. 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc

55. 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc? new:name change by .name=

56. 最后一次修改是直接修改? 所以沒(méi)法產(chǎn)生通知

四熊响,小結(jié)

KVO/KVC這種編碼方式使用起來(lái)很簡(jiǎn)單,很適用與datamodel修改后诗赌,引發(fā)的UIVIew的變化這種情況汗茄,就像上邊的例子那樣,當(dāng)更改屬性的值后铭若,監(jiān)聽(tīng)對(duì)象會(huì)立即得到通知洪碳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叼屠,隨后出現(xiàn)的幾起案子瞳腌,更是在濱河造成了極大的恐慌,老刑警劉巖镜雨,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫂侍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荚坞,警方通過(guò)查閱死者的電腦和手機(jī)挑宠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颓影,“玉大人各淀,你說(shuō)我怎么就攤上這事」罟遥” “怎么了碎浇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)咆畏。 經(jīng)常有香客問(wèn)我南捂,道長(zhǎng),這世上最難降的妖魔是什么旧找? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮麦牺,結(jié)果婚禮上钮蛛,老公的妹妹穿的比我還像新娘。我一直安慰自己剖膳,他們只是感情好魏颓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吱晒,像睡著了一般甸饱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天叹话,我揣著相機(jī)與錄音偷遗,去河邊找鬼。 笑死驼壶,一個(gè)胖子當(dāng)著我的面吹牛氏豌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播热凹,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼泵喘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了般妙?” 一聲冷哼從身側(cè)響起纪铺,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碟渺,沒(méi)想到半個(gè)月后鲜锚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡止状,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烹棉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怯疤。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浆洗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出集峦,到底是詐尸還是另有隱情伏社,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布塔淤,位于F島的核電站摘昌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏高蜂。R本人自食惡果不足惜聪黎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望备恤。 院中可真熱鬧稿饰,春花似錦、人聲如沸露泊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惭笑。三九已至侣姆,卻和暖如春生真,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捺宗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工柱蟀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偿凭。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓产弹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親弯囊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痰哨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 一、KVO(Key-Value-Observing) 鍵值觀察者模式匾嘱,說(shuō)白了就是當(dāng)你監(jiān)聽(tīng)的值發(fā)生變化時(shí)斤斧,會(huì)收到對(duì)應(yīng)...
    Ryan_RH閱讀 274評(píng)論 0 0
  • 一,概述 KVO,即:Key-Value Observing霎烙,它提供一種機(jī)制撬讽,當(dāng)指定的對(duì)象的屬性被修改后,則對(duì)象就...
    Crazy2015閱讀 558評(píng)論 0 5
  • 目錄:1.KVC用法悬垃;2.KVC和對(duì)象的setter游昼、getter方法的區(qū)別;3.key和keyPath的區(qū)別尝蠕;4...
    倫倫子_f7b3閱讀 574評(píng)論 0 1
  • KVC(Key-value coding)鍵值編碼烘豌,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了看彼,就是指iO...
    朽木自雕也閱讀 1,560評(píng)論 6 1
  • KVC簡(jiǎn)介 我們知道可以通過(guò)setter廊佩、getter方法來(lái)設(shè)置和修改對(duì)象的屬性,也知道如何通過(guò)簡(jiǎn)化的點(diǎn)語(yǔ)法來(lái)設(shè)置...
    請(qǐng)叫我周小帥閱讀 484評(píng)論 0 1