美文网首页
主题二《KVO、KVC》

主题二《KVO、KVC》

作者: 东方奇迹 | 来源:发表于2020-08-11 09:21 被阅读0次
    截屏2020-08-05 上午9.22.08.png 截屏2020-08-04 下午2.10.52.png 截屏2020-08-04 下午2.19.01.png 截屏2020-08-04 下午3.11.20.png 截屏2020-08-04 下午3.17.41.png 截屏2020-08-04 下午3.23.21.png 截屏2020-08-04 下午3.25.14.png 截屏2020-08-04 下午5.06.47.png 截屏2020-08-04 下午4.26.00.png 截屏2020-09-25 下午7.20.14.png 截屏2020-08-05 上午9.23.12.png 截屏2020-08-05 上午9.23.38.png
        YSPerson *person = [[YSPerson alloc]init];
        YSCat *cat = [[YSCat alloc]init];
        person.cat = cat;
        
        [person setValue:@10 forKey:@"age"];
        [person setValue:@60 forKeyPath:@"cat.weight"];
        
        NSLog(@"%@",[person valueForKey:@"age"]);
        NSLog(@"%@",[person valueForKeyPath:@"cat.weight"]);
    
    
    截屏2020-08-05 上午10.14.02.png 截屏2020-08-05 上午10.31.41.png 截屏2020-08-05 上午10.46.39.png

    1、iOS 用什么方式实现对一个对象的KVO?(KVO的本质是什么?)

    1、利用RuntimeAPI动态生成一个子类(命名eg:NSKVONotifying_MJPerson),并且让instance对象的isa指针指向这个全新的子类;
    2、当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数:
    (1)willChangeValueForKey:
    (2)父类原来的setter
    (3)didChangeValueForKey:(内部会触发监听器(Oberser)的监听方法(observeValueForKeyPath:ofObject:change:context:))

    2、如何手动触发KVO?

    手动调用willChangeValueForKey:和didChangeValueForKey:

    3、直接修改成员变量会触发KVO么?

    不会触发KVO

    4、KVC的赋值和取值过程是怎样的?原理是什么?

    如setValue:forKey:原理图所示;
    如valueForKey:原理图所示;

    5、通过KVC修改属性会触发KVO么?

    会触发KVO
    原因:
    [person setValue:@10 forKey:@“age”];
    系统内部实现等同于
    [person willChangeValueForKey:@“age”];
    person -> _age = 10;
    [person didChangeValueForKey:@“age”];

    相关文章

      网友评论

          本文标题:主题二《KVO、KVC》

          本文链接:https://www.haomeiwen.com/subject/rskwrktx.html