zoukankan      html  css  js  c++  java
  • KVC和KVO

    KVC:NSKeyValueCoding 

    KVO:NSKeyValueObserver

    KVO机制:当指定的对象的属性发生变化是主动通知另一个对象并触发相应的方法。

    每当在在类中定义一个监听:

    [self addObserver:self

    forKeyPath:@"items" options:0 context:contexStr]; 

    还可以监听其他对象的属性的变化

    [person addObserver:money forKeyPath:@"account" options:0 context:contexStr]; 

    只有当前类中items这个属性发生的变化都会触发到以下方法

    - (void)observeValueForKeyPath:(NSString *)keyPath

    ofObject:(id)object

    change:(NSDictionary *)change

    context:(void *)context 

    KVO的优点:

    当属性改变时,KVO会提供自动的消息通知。这样开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。

    同时KVO可以支持多个观察者观察同一个属性,以及相关的值。

    KVC的实现分析:

    KVC使用了一个isa-swizzling技术。

    isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位。isa指针,就是 is a kind of的意思,指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针和其他数据

    KVC的代码:

    [person setValue:@"personName" forKey:@"name"]; 

    KVC在调用方法setValue的时候

    (1)首先根据方法名找到运行方法的是偶所需要的环境参数。

    (2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。

    (3)再直接查找的来的具体的方法实现

    当一个对象注册了一个观察者,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是一个真实地类。

    所以isa指针其实不需要指向实例对象真实地类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。

    这样只有当我们调用KVC去访问key值的时候KVO才会起作用。所以KVO是基于KVC实现的。

  • 相关阅读:
    linux试题
    linux常用脚本
    nagios
    lvs/nginx/haproxy 负载均衡优缺点分析讲解
    一次SSLPeerUnverifiedException,SSLHandshakeException问题的分析
    [转]【安卓笔记】AsyncTask源码剖析
    linux下查看进程占用端口和端口占用进程命令
    which framework or library is best to use WebRTC
    [转]svn diff 替代工具
    [转]使用Subversion进行版本控制
  • 原文地址:https://www.cnblogs.com/youmei11/p/4626549.html
Copyright © 2011-2022 走看看