Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

介绍下KVO的原理 #70

Open
tbfungeek opened this issue Feb 10, 2020 · 0 comments
Open

介绍下KVO的原理 #70

tbfungeek opened this issue Feb 10, 2020 · 0 comments

Comments

@tbfungeek
Copy link
Owner

KVO 是通过 isa-swizzling 实现的,当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个子类,在这个子类中做如下的几方面工作:

  1. 重写基类中任何被观察属性的 setter 方法,而通过重写就获得了 KVO 需要的通知机制
- (void)setName:(NSString *)newName {
    [self willChangeValueForKey:@"name"];    // KVO在调用存取方法之前总调用
    [super setValue:newName forKey:@"name"]; // 调用父类的存取方法
    [self didChangeValueForKey:@"name"];     // KVO在调用存取方法之后总调用
}

KVO 在调用存取方法之前总是调用 willChangeValueForKey:,通知系统该 keyPath 的属性值即将变更。 当改变发生后,didChangeValueForKey: 被调用,通知系统该 keyPath 的属性值已经变更。 之后,observeValueForKey:ofObject:change:context: 也会被调用。

  1. 让这个重写的类成为原来类的子类:

除了完成上面提到的第一步操作的同时子类还重写了class 方法以“欺骗”外部调用者它就是起初的那个类。
然后系统将这个对象的 isa 指针指向这个新诞生的子类,因此这个对象就成为该子类的对象了,因而在该对象上对 setter 的调用就会调用重写的 setter,从而激活键值通知机制

  1. 重写派生类的dealloc 方法释放资源
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant