?一缨称、KVO(Key-Value-Observing)
鍵值觀察者模式,說(shuō)白了就是當(dāng)你監(jiān)聽(tīng)的值發(fā)生變化時(shí)祝迂,會(huì)收到對(duì)應(yīng)的通知睦尽。
一般分為三步:
注冊(cè)監(jiān)聽(tīng)
使用方法:
1.添加KVO監(jiān)聽(tīng)者
**@paramobserver 觀察者(監(jiān)聽(tīng)器)
*@paramkeyPath? 屬性名(要觀察的屬性)
*@paramoptions
*@paramcontext? 傳遞的參數(shù)*/
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void*)context;
例子:
//為對(duì)象p添加一個(gè)觀察者(監(jiān)聽(tīng)器)[p addObserver: self ?forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];
2.設(shè)置監(jiān)聽(tīng)事件
/** *? 當(dāng)利用KVO監(jiān)聽(tīng)到某個(gè)對(duì)象的屬性值發(fā)生了改變,就會(huì)自動(dòng)調(diào)用這個(gè)
?* *@paramkeyPath 哪個(gè)屬性被改了?
*@paramobject? 哪個(gè)對(duì)象的屬性被改了?
*@paramchange? 改成咋樣
?*@paramcontext 當(dāng)初addObserver時(shí)的context參數(shù)值?*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{? ?
?NSLog(@"%@ %@ %@ %@", object, keyPath, change, context);
}
3.取消監(jiān)聽(tīng)
//釋放KVO監(jiān)聽(tīng)
-(void)dealloc{? ??
[p removeObserver: self forKeyPath:@"test"];
}
二型雳、KVC(Key-Value-Coding)
鍵值編碼模式当凡,說(shuō)白了就是通過(guò)指定的key獲得想要的值value,而不是通過(guò)調(diào)用Setter纠俭、Getter方法訪問(wèn)沿量。
1 .訪問(wèn)私有變量
一個(gè)類中的私有變量,不能直接通過(guò)Setter冤荆、Getter方法訪問(wèn)朴则。但是卻可以通過(guò)KVC來(lái)訪問(wèn)。
2. 使用KVC直接訪問(wèn) NSArray 或者 NSSet 的屬性值
3. 使用KVC將字典(json)轉(zhuǎn)化成模型
注意:
(1). key的值必須正確钓简,如果拼寫(xiě)錯(cuò)誤乌妒,會(huì)出現(xiàn)異常
(2). 當(dāng)key的值是沒(méi)有定義的,valueForUndefinedKey:這個(gè)方法會(huì)被調(diào)用外邓,如果你自己寫(xiě)了這個(gè)方法撤蚊,key的值出錯(cuò)就會(huì)調(diào)用到這里來(lái)
(3). 因?yàn)轭恔ey反復(fù)嵌套,所以有個(gè)keyPath的概念坐榆,keyPath就是用.號(hào)來(lái)把一個(gè)一個(gè)key鏈接起來(lái)拴魄,這樣就可以根據(jù)這個(gè)路徑訪問(wèn)下去
(4). NSArray/NSSet等都支持KVC