?一、KVO(Key-Value-Observing)
鍵值觀察者模式,說白了就是當(dāng)你監(jiān)聽的值發(fā)生變化時(shí),會收到對應(yīng)的通知。
一般分為三步:
注冊監(jiān)聽
使用方法:
1.添加KVO監(jiān)聽者
**@paramobserver 觀察者(監(jiān)聽器)
*@paramkeyPath? 屬性名(要觀察的屬性)
*@paramoptions
*@paramcontext? 傳遞的參數(shù)*/
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void*)context;
例子:
//為對象p添加一個觀察者(監(jiān)聽器)[p addObserver: self ?forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];
2.設(shè)置監(jiān)聽事件
/** *? 當(dāng)利用KVO監(jiān)聽到某個對象的屬性值發(fā)生了改變,就會自動調(diào)用這個
?* *@paramkeyPath 哪個屬性被改了?
*@paramobject? 哪個對象的屬性被改了?
*@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)聽
//釋放KVO監(jiān)聽
-(void)dealloc{? ??
[p removeObserver: self forKeyPath:@"test"];
}
二、KVC(Key-Value-Coding)
鍵值編碼模式,說白了就是通過指定的key獲得想要的值value,而不是通過調(diào)用Setter、Getter方法訪問。
1 .訪問私有變量
一個類中的私有變量,不能直接通過Setter、Getter方法訪問。但是卻可以通過KVC來訪問。
2. 使用KVC直接訪問 NSArray 或者 NSSet 的屬性值
3. 使用KVC將字典(json)轉(zhuǎn)化成模型
注意:
(1). key的值必須正確,如果拼寫錯誤,會出現(xiàn)異常
(2). 當(dāng)key的值是沒有定義的,valueForUndefinedKey:這個方法會被調(diào)用,如果你自己寫了這個方法,key的值出錯就會調(diào)用到這里來
(3). 因?yàn)轭恔ey反復(fù)嵌套,所以有個keyPath的概念,keyPath就是用.號來把一個一個key鏈接起來,這樣就可以根據(jù)這個路徑訪問下去
(4). NSArray/NSSet等都支持KVC