KVO 底層實現

來源:互聯網
上載者:User

標籤:

#import "ViewController.h"#import "Person.h"@interface ViewController ()@property(nonatomic ,strong)Person * people;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    Person * people = [[Person alloc]init];        self.people = people;        people.name = @"xiaohua";        people.age = 10;      //KVO 索引值監聽 , 當監聽某個類的某一個成員屬性時,當這個成員屬性的值發生改變時,做出響應            //key與keyPath 的區別: key 值找一層, 也就本類的的屬性, 而keyPath 則可以向下尋找多層,也就是如果本類沒有, 就向其子類中尋找, 如果都沒有找到,就直接報錯        [people addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld  context:nil];        //KVO 的底層實現: 當程式運行到上一行代碼時, 也就是給屬性添加監聽者時,此時動態產生一個NSKVONotifying_子類,並修改之前類的isa指標,將當前類的isa指標修改為動態產生的子類的isa指標,
然後當給類的屬性賦值時, 就會調用子類的的set方法,根據監聽者的參數,儲存相應的資料,然後在set方法中調用父類的set方法,將值賦值給父類屬性,然後調用observeValueForKeyPath 告訴監聽者,屬性的值發送改變了}-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ self.people.age =10;}-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ NSLog(@"%@" , change); }

 

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.