We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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 是通过 isa-swizzling 实现的,当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个子类,在这个子类中做如下的几方面工作:
- (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: 也会被调用。
除了完成上面提到的第一步操作的同时子类还重写了class 方法以“欺骗”外部调用者它就是起初的那个类。 然后系统将这个对象的 isa 指针指向这个新诞生的子类,因此这个对象就成为该子类的对象了,因而在该对象上对 setter 的调用就会调用重写的 setter,从而激活键值通知机制
The text was updated successfully, but these errors were encountered:
No branches or pull requests
KVO 是通过 isa-swizzling 实现的,当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个子类,在这个子类中做如下的几方面工作:
KVO 在调用存取方法之前总是调用 willChangeValueForKey:,通知系统该 keyPath 的属性值即将变更。 当改变发生后,didChangeValueForKey: 被调用,通知系统该 keyPath 的属性值已经变更。 之后,observeValueForKey:ofObject:change:context: 也会被调用。
除了完成上面提到的第一步操作的同时子类还重写了class 方法以“欺骗”外部调用者它就是起初的那个类。
然后系统将这个对象的 isa 指针指向这个新诞生的子类,因此这个对象就成为该子类的对象了,因而在该对象上对 setter 的调用就会调用重写的 setter,从而激活键值通知机制
The text was updated successfully, but these errors were encountered: