新建一個(gè) Person 類(lèi)瓜饥,這個(gè)類(lèi)中有一個(gè) 年齡 age 屬性
@interface WYPerson : NSObject
/// 年齡
@property (nonatomic, assign) NSInteger age;
@end
在外界使用 KVO 調(diào)用:
#import "WYPerson.h"
@interface ViewController ()
@property (nonatomic, strong) WYPerson *person;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/* 要做的事情:
* 每增加一歲,就過(guò)一個(gè)生日
*/
WYPerson *aPerson = [WYPerson new];
_person = aPerson;
// 監(jiān)聽(tīng) 年齡 -> 有監(jiān)聽(tīng)塞栅,當(dāng)不需要的時(shí)候就銷(xiāo)毀
// 如果不是全局變量是局部變量荒勇,可以不用銷(xiāo)毀沦零,因?yàn)榇罄ㄌ?hào)完畢后就會(huì)自動(dòng)銷(xiāo)毀
[_person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)dealloc {
[_person removeObserver:self forKeyPath:@"age"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
NSLog(@"KVO 監(jiān)聽(tīng)年齡的改變 %ld", (long)_person.age);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 年齡發(fā)生改變的時(shí)候餐曼,KVO 開(kāi)始監(jiān)聽(tīng)
_person.age++;
}
KVO 是監(jiān)聽(tīng) set 方法有沒(méi)有調(diào)用
- _person -> _age += 1; 這個(gè)不是 set 方法,所以不會(huì)走 KVO 監(jiān)聽(tīng)
KVO 如何實(shí)現(xiàn) 監(jiān)聽(tīng)
- 調(diào)用 addObserver 方法的時(shí)候德频,就會(huì)動(dòng)態(tài)(runtime)生成一個(gè) WYPerson 子類(lèi)(又叫派生類(lèi))
- 這個(gè)子類(lèi)會(huì)繼承 父類(lèi)的所有方法苍息,目的: 重寫(xiě) 父類(lèi)屬性的 set 方法。
2.1 為什么要重寫(xiě)壹置?
因?yàn)橐谥貙?xiě)的 set 方法中去監(jiān)聽(tīng)屬性的改變 - 修改對(duì)象的 isa 指針