利用runtime自己动手实现KVO- 简书

昨天开始学习runtime写下做个记录,利用runtime实现系统的KVO,首先我们先来看一下系统的实现,首先定义Persion类添加一个name的属性,在ViewController类中初始化并添加一个kvo监听Persion类中name属性的变化


从控制台可以看出p对象的isa指向了一个NSKVONotifying_Persion的一个类.所以我们用runtime动态创建一个类重写其中的setName方法,在setName的方法中得到改变的值通过objc_msgSend()方法发送到viewController控制器中。

*注 xcode 9 objc_msgSend()传递多个参数需要把Enable Strict Checking of objc_msgSend Calls 设置为NO


下面主要利用runtime实现KVO主要代码实现

新建一个NSObject的Category

- (void)ZH_addObserver:(NSObject*)observer forKeyPath:(NSString*)keyPath options:(NSKeyValueObservingOptions)options context:(nullablevoid*)context{

//得到当前类名称

NSString*oldClassName =NSStringFromClass([selfclass]);

//自定义类名

NSString*NewClassName = [@"ZH_"stringByAppendingString:oldClassName];

//转换为c语言语法

constchar* newName = [NewClassNameUTF8String];

ClassMyclass =objc_allocateClassPair([selfclass], newName,0);

//重写setAge方法!!

class_addMethod(Myclass,@selector(setName:), (IMP)setName,"v@:@");

//注册这个类

objc_registerClassPair(Myclass);

//修改被观察者的isa指针!!让它指向自定义的类!!

object_setClass(self, Myclass);

//使用key绑定observer 以供下面发送通知使用

objc_setAssociatedObject(self,@"111", observer,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

void setName(idself,SEL_cmd,idname){

//保存当前类型

ClassfClass = [selfclass];

//改变当前对象指向父类!!

object_setClass(self,class_getSuperclass([selfclass]));

//调用父类的setName方法

objc_msgSend(self,@selector(setName:),name);

//拿出观察者

idobserver =objc_getAssociatedObject(self,@"111");

//通知外界

objc_msgSend(observer,@selector(observeValueForKeyPath:ofObject:change:context:),self,@"name",@{@"new":name},nil);

object_setClass(self, fClass);

}

利用业余时间记录一下,如有错误欢迎指正,有兴趣的朋友可以互相交流,希望大家共同进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,890评论 0 9
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    made_China阅读 4,946评论 0 7
  • 参考链接: http://www.cnblogs.com/ioshe/p/5489086.html 简介 Runt...
    乐乐的简书阅读 6,483评论 0 9
  • 简介 KVO相信iOS开发者们都听说过,在面试中也会被常常问到,但是呢对于KVO来说更多的事情是由系统来做的,依赖...
    a437e8f87a81阅读 8,316评论 3 11
  • App更新策略课程一共有六节,本节是最后一节,将会给大家总结一下我们App更新的时候有那些常见场景,并依据这些场景...
    IT_xiao小巫阅读 5,238评论 1 6

友情链接更多精彩内容