美文网首页
kvc 与 kvo

kvc 与 kvo

作者: 竹尖 | 来源:发表于2017-09-07 20:36 被阅读0次

    1.KVO KVC 没联系

    2.KVO 是监听属性值的改变

    3.KVO 底层实现原理是系统给当前类创建子类 , 在子类 setter 方法调用父类的 setter 方法

    1.kvc   原理, 运行时------>遍历----找到属性(key)赋值

    .可以访问私有成员变量的值

    2.可以间接修改私有成员变量的值(替换系统自带的导航栏、tabbar)

    举个例子:我现在要替换系统自带的tabbar,但是,系统的是“ readonly”的。解决方法是:KVC。

    赋值原理:

    (1)去模型中查找有没有setIcon方法,就直接调用这个set方法,给模型这个属性赋值[self setIcon:dict[@"icon"]];

    (2)如果找不到set方法,接着就会去寻找有没有icon属性,如果有,就直接访问模型中icon = dict[@"icon"];

    (3)如果找不到icon属性,接着又会去寻找_icon属性,如果有,直接_icon = dict[@"icon"];

    (4)如果都找不到就会报错

    [ setValue:forUndefinedKey:]

    用处:修改pageControl图片

    UIPageControl *pageControl = [[UIPageControl alloc] init];

    [pageControl setValue:[UIImage imageNamed:@"home_slipt_nor"] forKeyPath:@"_pageImage"];

    [pageControl setValue:[UIImage imageNamed:@"home_slipt_pre"] forKeyPath:@"_currentPageImage"];

    2.kvo

    //注意 KeyPath 与 Key 虽然都是通过键去找值但 KeyPath 会自动寻址

    //比如说我 height 属性里还有一个"躺下的高度"或"站着的高度"(哈哈还  太污了)

    //通过 KeyPath 就会层层深入找到  Key 就只能找 height 这一层

    //NSKeyValueObservingOptionOld 属性的旧值

    //NSKeyValueObservingOptionNew 属性的新值

    //context 携带的参数

    [person addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

    //我要改值了

    person.height = 181;

    }

    //keyPath

    //object 被修改属性的类的对象

    //change 返回改变前后的属性与属性值(字典)

    //context 携带的参数

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{

    NSLog(@"%@",change);

    }

    kvo触发

    自动触发的场景:在注册KVO之前设置一个初始值,注册之后,设置一个不一样的值,就可以触发了

    手动触发演示

    相关文章

      网友评论

          本文标题:kvc 与 kvo

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