第四章、runtime相关
2019-08-09 本文已影响0人
Evans_Xiao
一、objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?
objc_msgSend()
是[obj foo]
的具体实现。
在runtime中,objc_msgSend()
是一个c函数,[obj foo]
会被翻译成这样的形式objc_msgSend(obj, foo)
。
OC到C的转换过程分析:[obj foo];
=>objc_msgSend(obj, @selector(foo));
二、runtime简介
runtime简称运行时。OC就是运行时机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数。对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
三、说说什么是runtime
1、OC是一个全动态语言,OC的一切都是基于runtime实现的。平时编写的OC代码,在程序运行过程中,其实最终都是转成了runtime的C语言代码,runtime算是OC的幕后工作者。
2、runtime是一套比较底层的纯C语言API,属于1个C语言库,包含了很多底层的C语言API。
3、runtimeAPI的实现是用C++开发的(源码中的实现文件都是mm),是一套苹果开源的框架。
四、runtime应用场景
1、动态交换两个方法的实现
2、动态添加属性
3、实现字典转模型的自动转换
4、动态添加方法
5、拦截并替换方法
6、实现NSCoding
的自动归档和解档
五、runtime函数的定义规则
对对象进行操作的方法一般以object_
开头
对类进行操作的方法一般以class_
开头
对类或对象的方法进行操作的方法一般以method_
开头
对成员变量进行操作的方法一般以ivar_
开头
对属性进行操作的方法一般以property_
开头开头
对协议进行操作的方法一般以protocol_
开头