zoukankan      html  css  js  c++  java
  • iOS KVO和KVC的原理

    KVO的实现原理:

    KVO是键值监听,需要知道一个对象的属性的变化时做出相应。
    用法:
    1、添加监听addObserver  
    2、当所观察的属性值发生改变时调用的函数observalue: ForKeyPath:
    原理:
    1、当添加了监听之后,对象的isa指针指向的是 NSKVONotifying_ 的一个类,NSKVONotifying_的super类是原先的类。
    2、当值改变时,NSKVONotifying_ 方法里包含三步骤:1.willChangeValueForKey方法 2.改变属性值 3.didChangeValueForKey方法
    3、在didChangeValueForKey里通知监听者属性已改变。
    其他:
    1、直接打印已添加监听的对象的类名是原对象的类名,需要用runtime的object_getClass()方法才能获取NSKVONotifying_ 类
    2、直接获取类名获取不出来,是因为NSKVONotifying_ 重写了获取类名的方法,因为不想暴露NSKVONotifying_这个类
    3、KVO的本质是set方法,直接修改成员变量不会触发KVO
    4、手动触发KVO方法是调用willChangeValueForKey和didChangeValueForKey

    KVC的实现原理:
    KVC是键值编码,通过key来访问对象的属性,或者给对象的属性去赋值。
    用法:
    1、valueForKey: 获取值  setValue: forKey: 设置值
    2、valueForKeyPath: 获取值  setValue: forKeyPath: 设置值  可以使用点语法更深入的获取或者设置值
    原理:
    1、valueForKey: 是使用getter方法搜索实例,如get<key>,<key>,is<key>,_<key>的拼接方案,搜索到了就返回这个结果。失败了就调用valueForUndefinedKey:方法并抛出异常
    2、setValue:forKey: 是使用setter方法搜索实例,如set<key>:,_set<key>,_<key>,<key>,_is<key>,is<key>>的拼接方案,搜索到了就讲value赋值给实例变量。失败了则调用setValue:forUndefinedKey:方法并抛出异常。

  • 相关阅读:
    成功解决vc6.0智能提示消失的BUG
    如何在vc6,vc7,vc8下编译x264
    Visual C++ 操作MS Offfice 控件
    在英文版Visual Studion 2005 professional 中使用 Windows Mobile 2003 SE中文模拟器
    x264 20060731 svn 版的编码移植
    泛型算法:Tips
    05年度EmilMatthew’s Blog文档整理
    常用软件滤波方法及其示例程序
    windows server 2003 配置
    TI C64X 视频处理应用编程重点内容提示
  • 原文地址:https://www.cnblogs.com/shen5214444887/p/12309352.html
Copyright © 2011-2022 走看看