最近在研究runtime 主要是想好好的装一波 无奈 看过了 唐巧大大的runtime介绍 看的我是脑袋直疼,看来太理论的东西不适合我啊 不过我还是自己敲了敲代码知道了常用的几种方法,至于理论性的东西 容我再升级下大脑再补充吧;
RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。
对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。
OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。
只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。
前面借鉴了别人的东西直接复制过来了 。
下面直接来几个实际的例子说明吧;
一,方法的交换
方法交换说白了就是 你有一个充电器 我有一部手机 你把充电器给我了 我不仅可以打电话 还可以充电 就相当于 我不仅有你自带的功能 我还可以在你自带的功能上再增加新的功能;
我这些功能都是写在了分类里
+ load 这个方法 只会在开始的时候调用一次 所以交换方法写在这里是最好的了;
class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)
第一个参数是你要在哪个类里交换方法,第二个参数就是你要交换的方法名称
因为在分类里不能调用父类 所以你要在分类里重写一下 你要交换方法
因为这个类已经被交换掉了 所以 现在我调用[self lymViewDidload];实际上就是在调用 viewDidLoad的方法;
BOOL isBool = class_addMethod(cls, viewDidApp, method_getImplementation(m2), method_getTypeEncoding(m2));
第一个参数是要调用的类 第二个参数是方法 第三个参数是要交换的方法
大概意思 就是 判断一下 我试图在viewDidLoad方法里添加一个我写的新方法 如果成功了 就在 我写的方法里 添加一下 系统写的方法;如果失败了 就说明两个方法都已经添加进去了 直接交换就行;