iOS开发KVO底层原理四步曲

kvo底层是用runtime实现的,核心原理一共有四步。

1. 根据已有类获取kvo子类类名:

NSString *kvoClassName = [NSString stringWithFormat:@"CBKVO_%@",NSStringFromClass([self class])];
Method setMethod = class_getInstanceMethod([self class], NSSelectorFromString(setName(keyPath)));
NSString *setName(NSString *keyPath) {
    NSString *setName = [NSString stringWithFormat:@"set%@%@:",[[keyPath substringToIndex:1] uppercaseString],[keyPath substringFromIndex:1]];
    return setName;
}

2. 根据类名,创建子类,添加自定义的set方法:

///2.1创建类
Class kvoClass = objc_allocateClassPair([self class], kvoClassName.UTF8String, 0);
//2.2添加方法
class_addMethod(kvoClass, NSSelectorFromString(setName(keyPath)), (IMP)KVO_SetMethod, method_getTypeEncoding(setMethod));
//2.3注册新类
objc_registerClassPair(kvoClass);

3. 交换两个类的指针:

object_setClass(self, kvoClass);

4. 在自定义的set函数中调用父类的set方法,改变属性值:

void KVO_SetMethod(id self ,SEL _cmd ,id value) {
    NSLog(@"set方法执行了%@--%@",self,NSStringFromSelector(_cmd));
    struct objc_super superClass = {
        .receiver = self,
        .super_class = class_getSuperclass([self class]),
    };
    void (*cbkvo_super)(void *,SEL,id) = (void *)objc_msgSendSuper;
    cbkvo_super(&superClass,_cmd,value);
}

结语:上述四步展示的就是KVO底层实现所调用的runtime API,下篇博客将会介绍自定义KVO详细的demo实现。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,141评论 1 32
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,348评论 0 11
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,768评论 0 9
  • 1明天八点一刻大礼堂,研究生大会 明天下午流体七楼入学教育 礼拜三九点七楼,学籍管理和 礼拜五上午体检,空腹抽血,...
    BoBo很忙阅读 166评论 0 0
  • 他是个哑巴,不会说话,有时候,她记性不好,忽然问他外面天气怎么样,他便会着急的在原地发抖,她已经记不得有多少次让他...
    相遇不如重逢阅读 230评论 0 0