• KVC、KVO实现过程


    1.KVC的实现过程

    以 [object setValue:@"134567" forKey:@"uid"];为例子,来探究KVC的实现过程

    第一步:搜索
    1、首先搜索setKey:方法.(key指成员变量名, 首字母大写)
    2、上面的setter方法没找到, 如果类方法accessInstanceVariablesDirectly返回YES. 那么按 _key, _isKey,key, iskey的顺序搜索成员名.(NSKeyValueCodingCatogery中实现的类方法, 默认实现为返回YES)
    3、如果没有找到成员变量, 调用setValue:forUnderfinedKey:

    第二步:编译器处理
    被编译器处理后:
    // 首先找到对应sel
    SEL sel = sel_get_uid("setValue:forKey:");
    // 根据object->isa找到sel对应的IMP实现指针
    IMP method = objc_msg_lookup (object->isa,sel);
    // 调用指针完成KVC赋值
    method(object, sel, @"134567", @"uid");

    解释:
    1.先根据方法名通过C函数sel_get_uid拿到选择子sel
    2.使用C函数objc_msg_lookup通过对象指针,选择子获取函数实现指针
    3. 调用C函数method(object, sel, @"134567", @"uid"),实现KVC赋值

    2.KVO的实现过程

    第一步:调用KVC方法
    KVO若有起作用,首先要先调用KVC方法:
    [self.object addObserver:self forKeyPath:@"uid" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];

    第二步:实现KVO后,系统相应的处理
    系统实现KVO有以下几个步骤:
    1.当类A的对象第一次被观察的时候,系统会利用运行时动态创建与类A一样的NSKVONotifying_A派生类, 并且只有1个属性的get, set方法实现.
    2.在派生类NSKVONotifying_A中重写类A的setter方法,NSKVONotifying_A类在被重写的setter方法中实现通知机制。
    3.类NSKVONotifying_A重写会 class方法,将自己伪装成类A。类NSKVONotifying_A还会重写dealloc方法释放资源。
    4.系统将所有指向类A对象的isa指针指向类NSKVONotifying_A的对象。

    参考文章:
    KVC, KVO 实现原理:http://www.cnblogs.com/MrTao/p/5825457.html

  • 相关阅读:
    作业1
    113
    112
    工作量统计
    测试大纲
    2019-2020-2 20175335丹增罗布《网络对抗技术》Exp8 Web基础
    2019-2020-2 20175335丹增罗布 《网络对抗技术》Exp7 网络欺诈防范
    2019-2020-2 20175335丹增罗布 《网络对抗技术》Exp6 MSF基础应用
    2019-2020-2 20175335 丹增罗布 《网络对抗技术》Exp5 信息搜集与漏洞扫描
    2019-2020-2 20175335 丹增罗布《网络对抗技术》Exp4 恶意代码分析
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/6946968.html
Copyright © 2020-2023  润新知