KVO的实现原理

KVO的具体实现

#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
/** p1 */
@property (strong, nonatomic) Person *p1;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.什么是通知
    
    // 3个对象
    self.p1 = [[Person alloc] init];
    self.p1.name = @"p1";
    
    // KVO是监听对象的属性值的改变的
    [self.p1 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    self.p1.name = @"123";
    
}
// 这个方法时属于 NSObject 类的,任何对象都可以作为观察者
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    NSLog(@"监听到了%@的%@属性发生了改变", object, keyPath);
    NSLog(@"%@", change);
}
@end

KVO是基于运行时实现的

isa Class NSKVONotifying_Person  0x000001a12de2f545

上述例子中,当 p1.name 的值改变时,p1对象的 isa 指针会指向 NSKVONotifying_Person,意味着,在程序运行时,会动态生成一个 NSKVONotifying_Person 类,该类继承于 Person,而且该类中也有个 -setName: 方法,方法中在设置 name 的同时实现了:

- (void)setName:(NSString *)name
{
   [super setName:name];
   // 这两个方法底层会调用observer的- (void)observeValueForKeyPath: ofObject: change: context:这个方法
   [self willChangeValueForKey:@"age"];
   [self didChangeValueForKey:@"age"];
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 老去的故乡 当玉米树枯了不再回荣 当锄音几成山谷的绝响 田野渐渐荒废成你额头上的道道皱纹 荒草是胡子 纠结着乱长 ...
    笨笨厂阅读 242评论 0 1
  • 2014/06/12 XHTML CSS基础知识 我们可以把它想像成现实中上方开口的盒子,然后从正上往下俯视,边框...
    姜基基阅读 584评论 0 2
  • 大道理人人都懂,然而在企业中的真实情况却是: 公司管理层天天说风险,为什么员工对风险却没什么概念?是领导在危言耸听...
    阵雨_aac9阅读 369评论 0 0
  • 本人湘潭伢子,家乡盛产槟榔。在这里,我们都是“槟榔一口,精神抖擞”,“槟榔加烟,法力无边”。哈哈!95后,大学毕业...
    c377e2248fad阅读 129评论 0 0
  • 风趣科普类,有点类似《性别战争》——好像有的动物特质在两本书里都有提及。 这么大个儿的书名已经很不言自明了,这本书...
    一条污蚣阅读 1,072评论 0 0

友情链接更多精彩内容