ios拓展19-KVO淺解

筆者在網上看到關于KVO的原理,往往都有運行時,并且寫的比較詳細. 但是要想看懂,首先要熟悉運行時的方法(至少用到的幾個方法要知道), 對于新手門檻高,今天給大家來個簡單淺顯的講解, 不涉及運行時方法.

ps:如果想知道KVO是如何通過運行時實現的,網上這方面資料很多,后期筆者也會增加

1. 下面是一個簡單的kvo運用

@interface ViewController ()
@property (strong, nonatomic) Person    *person;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.person = [Person new];
    self.person.age = 18;//====person 只有一個age成員變量
    
    // kvo監聽前  isa指針
    NSLog(@"isa:%@",[self.person valueForKeyPath:@"isa"]);
    
    // 添加監聽者
    [self.person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
    
    // kvo監聽后   isa指針
    NSLog(@"isa:%@",[self.person valueForKeyPath:@"isa"]);
    self.person.age = 20;
    
}
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSString*, id> *)change context:(nullable void *)context {
    NSLog(@"%@",change);
}
isa指針改變
2. 如果我們自定義個 NSKVONotifying_Person 類,
此時,程序運行會出錯,  kvo其實就是通過運行時動態創建一個繼承Person的子類, 并重寫了被觀察屬性keyPath的setter 方法
當使用kvo監聽,其實是監聽NSKVONotifying_Person的,    
增加后,程序會報錯
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、概述 KVO,即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改后,則其觀察...
    DeerRun閱讀 10,128評論 11 33
  • KVC 什么是 KVC KVC 是 Key-Value-Coding 的簡稱。 KVC 是一種可以直接通過字符串的...
    LeeJay閱讀 2,217評論 6 41
  • 前言: 本文基本不講KVC/KVO的用法,只結合網上的資料說說對這種技術的理解。 由于KVO內容較少,而且是以KV...
    土b蘭博王閱讀 3,087評論 0 33
  • KVO即key-value-observing,鍵值觀察,是一種觀察者模式的實現機制(另一種為Notificati...
    xinghunMeng閱讀 225評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,301評論 25 708