KVO(鍵值監聽),即 Key-Value Observing, 是Objective-C 對觀察者設計模式的一種實現。它提供一種機制,當指定的對象的屬性被修改後(執行了setter 或 KVC 賦值),對象就會接受到通知。html
當某個對象的某個屬性值改變時,用KVO監聽。設計模式
一、模型建立 在.h中數組
@interface PDcar : NSObject
@property (nonatomic,assign) int num; // 屬性
@end
複製代碼
二、在 VC 中監聽並響應屬性改變markdown
@interface ViewController ()
@property (nonatomic,strong)PDcar *myCar; //聲明瞭car屬性
@end
複製代碼
- (void)viewDidLoad {
[super viewDidLoad];
self.myCar = [[PDcar alloc] init];
//設置監聽
[self.myCar addObserver:self forKeyPath:@"num" options:
NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
}
複製代碼
三、實現監聽回調方法oop
// 只要object的keyPath屬性發生變化,就會調用此方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change context:(void *)context{
// 判斷是否爲self.myCar的屬性「num」:
if([keyPath isEqualToString:@"num"] && object == self.myCar) {
// 響應變化處理
self.label.text = [NSString stringWithFormat:@"當前的num值爲:%@",
[change valueForKey:@"new"]];
//change的使用:上文註冊時,枚舉爲2個,所以能夠提取change字典中的新、舊值的這兩個方法
NSLog(@"oldnum:%@ ----newnum:%@",[change valueForKey:@"old"],
[change valueForKey:@"new"]);
}
}
複製代碼
四、註銷監聽atom
-(void)dealloc{
// 移除KVO
[self removeObserver:self forKeyPath:@"num" context:nil];
}
複製代碼
注意!同一個屬性不能重複removeObserver,不然會出問題。spa
www.cnblogs.com/XYQ-208910/…設計
二者都是一對多,可是對象之間直接的交互,notification 明顯得多,須要notificationCenter 來作爲中間交互。而 KVO 如咱們介紹的,設置觀察者->處理屬性變化,至於中間通知這一環,則隱祕多了,只留一句「交由系統通知」,具體的可參照以上實現過程的剖析。代理
notification 的優勢是,監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,例如鍵盤、先後臺等系統通知的使用也更顯靈活方便。code
這兩個都是負責發送接收通知,剩下的事情由系統處理,因此不用返回值;而 delegate 則須要通訊的對象經過變量(代理)聯繫; delegate 通常是一對一,而這兩個能夠一對多。