赞
踩
今天下定决心写一篇runtime的文章来记录一下runtime的用法吧。刚开始觉得runtime很高大上很深奥的样子,其实,理解使用之后还是这个样子。在写之前也看多几篇网上的文章,有些写的很好,可以缺乏源码,就只有个别说明,感觉模拟两可,有些只是说到一部分,成分残缺一样,不过还是自己亲自写一篇好,起码我真能理解到这里。
首先先说一下runtime的基本概念。借网上的一段话。
Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效而作出的努力。你可以在这里下到苹果维护的开源代码。苹果和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。Objective-C 从三种不同的层级上与 Runtime 系统进行交互,分别是通过 Objective-C 源代码,通过 Foundation 框架的NSObject类定义的方法,通过对 runtime 函数的直接调用。大部分情况下你就只管写你的Objc代码就行,runtime 系统自动在幕后辛勤劳作着。
RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。
对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。
OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错
)。
只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。
接下来说一下,runtime里面提供给我们的api有哪些,这些api我基本都会举例子来去用一下它的
主意:
C语言是一门静态语言,声明的方法必须要有实现,才能调用,不然连编译都不通过
然后实现myFunction方法之后,就能变易通过了
OC语言只有声明,没有实现也是可以的
但是运行之后就会崩掉,因为找不到该方法的实现
在动态添加方法(1)–源码用到这个方法
参数说明:
BOOL: 返回值,yes-------方法添加成功 no--------方法添加失败
Class cls: 将要给添加方法的类,传的类型 [类名 class]
SEL name: 将要添加的方法名,传的类型 @selector(方法名)
IMP imp:实现这个方法的函数 ,传的类型 1,C语言写法:(IMP)方法名 2,OC的写法:class_getMethodImplementation(self,@selector(方法名:))
class_addMethod(<#Class _Nullable __unsafe_unretained cls#>, <#SEL _Nonnull name#>, <#IMP _Nonnull imp#>, <#const char * _Nullable types#>)
注意:const char *types:表示我们要添加的方法的返回值和参数
“v@
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。