標籤:賦值 super view nbsp 變化 崩潰 使用步驟 ict new
1、KVO
KVO簡介:Key Value Observing,通過Key鍵觀察對象的對應Key鍵的屬性值Value是否發生改變。
KVO的作用: 當前對象想監聽另一個對象的某個屬性是否發生變化。
KVO使用步驟:①給對象的某個屬性添加監聽器;②監聽器實現監聽方法;③對象銷毀前一定要移除監聽器。
當前對象監聽另一個對象的某個屬性:
[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 的作用,噹噹前對象實現監聽方法後,監聽方法中的change字典中能夠擷取監聽的另一個對象屬性改變前後的值。
當前對象實現- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context方法;
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ NSLog(@"%@對象的%@屬性發生變化", object, keyPath); NSLog(@"%@", change);}
在監聽方法中,可以根據相應的key去擷取change字典中的對應的值。
當前對象監聽被監聽對象的屬性必須在前,另一個對象的屬性變化必須在後;
在被監聽對象銷毀前一定要移除監聽器;
完整的KVO監聽:
- (void)viewDidLoad { [super viewDidLoad]; // 1. 建立Person對象 HFPerson *p = [[HFPerson alloc] init]; // 2. 註冊監聽 [p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; // 3. 改變對象屬性 p.name = @"卡哇伊"; // 4. 移除監聽 [p removeObserver:self forKeyPath:@"name"];}/** 監聽器實現的監聽方法 @param keyPath 哪個被監聽器監聽的屬性 @param object 哪個對象被監聽器監聽 @param change 儲存對象屬性值變化前後的字典 @param context 對象註冊監聽器時傳入的資料(一般用於對象之間進行通訊) */- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{ NSLog(@"%@", change);}
KVO樣本:
// cc監聽了aa的name屬性的改變[aa addObserver:cc forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];// cc得實現監聽方法/*** 當監聽到object的keyPath屬性發生了改變*/- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{NSLog(@"監聽到%@對象的%@屬性發生了改變, %@", object, keyPath, change);}
2、KVC\KVO使用情境:
【BUG匯總】
BUG-1:被監聽對象已經銷毀,但是沒有移除監聽;
解決方案:在被監聽對象銷毀前移除監聽,可以嘗試在被監聽對象的dealloc方法中移除監聽器;但是,可能需要將監聽器作為屬性儲存至被監聽對象中、或者使用代理、block。
注意事項:被監聽對象移除監聽器時,監聽器和被監聽的屬性必須和註冊監聽時一模一樣;否則,程式將會崩潰。
iOS核心筆記—KVO機制