iOS核心筆記—KVO機制

來源:互聯網
上載者:User

標籤:賦值   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];
    • 格式: [被監聽對象 addObserver:監聽者 forKeyPath:屬性名稱 options: context:]

    • 被監聽者告訴監聽器你要監聽我的哪個屬性。

  • 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使用情境:
  • KVC(Key Value Coding)常見作用:給模型屬性賦值;

  • KVO(Key Value Observing)常用作用:監聽模型屬性值的改變。

【BUG匯總】
  • BUG-1:被監聽對象已經銷毀,但是沒有移除監聽; 

  • 解決方案:在被監聽對象銷毀前移除監聽,可以嘗試在被監聽對象的dealloc方法中移除監聽器;但是,可能需要將監聽器作為屬性儲存至被監聽對象中、或者使用代理、block。 

  • 注意事項:被監聽對象移除監聽器時,監聽器和被監聽的屬性必須和註冊監聽時一模一樣;否則,程式將會崩潰。 

 

iOS核心筆記—KVO機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.