runtime是什么?
runtime 是 OC底层的一套C语言的API(引入<objc/runtime.h>
或<objc/message.h>
),编译器最终都会将OC代码转化为运行时代码,通过终端命令编译.m 文件:clang -rewrite-objc xxx.m可以看到编译后的xxx.cpp(C++文件)。比如我们创建了一个对象[[NSObject alloc]init],最终被转换为几万行代码,截取最关键的一句可以看到底层是通过runtime创建的对象,删除掉一些强制转换语句,可以看到调用方法本质就是发消息,[[NSObject alloc]init]语句发了两次消息,第一次发了alloc 消息,第二次发送init 消息。
id obj = object_msgSend(objc_getClass("NSObject"), sel_registerName("alloc"));
objc_msgSend(obj, sel_registerName("init");
需要注意的是,使用objc_msgSend()sel_registerName()方法需要import<objc/message.h>
runtime 可以做一些OC不容易实现的功能
动态交换两个方法的实现(特别是交换系统自带的方法)
动态添加对象的成员变量和成员方法
获得某个类的所有成员方法、所有成员变量
runtime怎么用
·1.将某些OC代码转为运行时代码,探究底层,比如block的实现原理;
·2.拦截系统自带的方法调用,比如拦截imageNamed:、viewDidLoad、alloc;
·3.实现分类而且可以增加属性;
·4.实现NSCoding的自动归档和自动解档;
·5.实现字典和模型的自动转换。
交换和拦截方法
交换方法
需要import<objc/runtime.h>
其中方法包括实例方法和类方法,那么获取某个类的方法的就有两种
//获取类方法
Method class_getClassMethod(Class cls, SEL name)
//获取实例方法
Method class_getInstanceMethod(Class cls, SEL name)
//交换方法,将m1与m2互相
交换
void method_exchangeImplementations(Method m1, Method m2)
类方法交换

实例方法交换

实例方法与类方法互换

网友评论