复习 KVO - 1

2018-08-08  本文已影响0人  文瑶906

新建一个 Person 类,这个类中有一个 年龄 age 属性

@interface WYPerson : NSObject

/// 年龄
@property (nonatomic, assign) NSInteger age;

@end

在外界使用 KVO 调用:

#import "WYPerson.h"


@interface ViewController ()

@property (nonatomic, strong) WYPerson *person;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    
    /* 要做的事情:
     * 每增加一岁,就过一个生日
     */
    WYPerson *aPerson = [WYPerson new];
    _person = aPerson;
    
    // 监听 年龄  -> 有监听,当不需要的时候就销毁
    // 如果不是全局变量是局部变量,可以不用销毁,因为大括号完毕后就会自动销毁
    [_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 监听年龄的改变 %ld", (long)_person.age);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
    // 年龄发生改变的时候,KVO 开始监听
    _person.age++;
}

KVO 是监听 set 方法有没有调用


KVO 如何实现 监听

  1. 调用 addObserver 方法的时候,就会动态(runtime)生成一个 WYPerson 子类(又叫派生类)
  2. 这个子类会继承 父类的所有方法,目的: 重写 父类属性的 set 方法。
    2.1 为什么要重写?
    因为要在重写的 set 方法中去监听属性的改变
  3. 修改对象的 isa 指针
上一篇 下一篇

猜你喜欢

热点阅读