標籤:
#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 底層實現