iOS Runtime详解(新手也看得懂)

2020-01-21 07:51:57刘景俊

KVO 的键值观察通知依赖于 NSObject 的两个方法:willChangeValueForKey:和 didChangeValueForKey: ,在存取数值的前后分别调用 2 个方法:

被观察属性发生改变之前,willChangeValueForKey:被调用,通知系统该 keyPath 的属性值即将变更;

当改变发生后, didChangeValueForKey: 被调用,通知系统该keyPath 的属性值已经变更;之后,

observeValueForKey:ofObject:change:context:也会被调用。且重写观察属性的setter 方法这种继承方式的注入是在运行时而不是编译时实现的。

KVO 为子类的观察者属性重写调用存取方法的工作原理在代码中相当于:


- (void)setName:(NSString *)newName { 
   [self willChangeValueForKey:@"name"];  //KVO 在调用存取方法之前总调用 
   [super setValue:newName forKey:@"name"]; //调用父类的存取方法 
   [self didChangeValueForKey:@"name"];   //KVO 在调用存取方法之后总调用
}

消息转发(热更新)解决Bug(JSPatch)

JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码动态修复 bug。

关于消息转发,前面已经讲到过了,消息转发分为三级,我们可以在每级实现替换功能,实现消息转发,从而不会造成崩溃。JSPatch不仅能够实现消息转发,还可以实现方法添加、替换能一系列功能。

实现NSCoding的自动归档和自动解档

原理描述:用runtime提供的函数遍历Model自身所有属性,并对属性进行encode和decode操作。