Runtime到底是什么鬼?
无论面试、论坛、群组...只要是跟ios开发有关的地方,到处都有runtime这个词。各种文章描述的神乎其技,就差把量子物理或者弦理论的知识也用上了。这么diao的东西到底是什么那?我们用最简单的方式来介绍一下,保证只要是猿类,就一定能听懂。
1: 什么是runtime
runtime,就是运行时,意思就是“在运行的时候xxoo”。
没错就是这么简单,解释一下:Objective-C程序运行的时候,需要一个底层库的支持,这个底层库就叫做runtime。
Objective-C语言把很多在编译和链接时候需要做的工作,推迟到了程序运行的时候由runtime来完成。runtime就好像是Objective-C语言的操作系统。这意味着该语言不仅需要一个编译器,还需要runtime来执行编译后的代码(在非mac平台使用了其他方案)。
2: 为什么要runtime?
runtime让OC变得更加灵活。或许只是你没注意,大多数人都直接使用过runtime的功能的,最常见的就是:
//判断一个类是否可以执行一个方法[通常用在判断代理(delegate)是否实现了@protocol(协议)的可选(@optional)方法时)]
if ([self.delegate respondsToSelector:@selector(fun)]) {
[self.delegate fun];
} else {
//self.delegate 没有实现fun方法;
}
上面代码的功能,就是在“运行的时候”,判断一个类是否实现了某个方法。respondsToSelector提供的这种功能,就是对runtime的直接使用。
3: runtime还可以做什么?
通过上面的例子,估计你对runtime已经有了一个大概的理解。其实,在开发过程中,直接依赖runtime开发是比较少的,但是runtime却无处不在,OC的大部分功能都是通过运行时来完成的。甚至,调用一个方法:
[myobject fun];
仔细想想,最初学习OC的时候,是不是看到过“发送消息”这句话?没错,[myobject fun]并不是简单的方法调用,而是在运行时给myobject发送了一个fun消息,如果myobject能够找到对应的fun处理逻辑,就会去执行fun消息的处理逻辑(就是fun方法的实现)。
编译阶段,
[myobject fun];
会被转换为:
objc_msgSend(myobject, @selector(fun))
可见,编译阶段只确定了运行时会向接收者myobject发送这条消息而已。
既然是运行时完成的,那么我们不就可以在运行时动态的改变调用的目标、查看一个对象可以处理的所有消息、包含的成员名称等等吗?甚至可以通过动态生成的一个字符串形式的类名+方法名,去调用这个类的方法。 这就是runtime可以做的事。
例:使用字符串描述的类名+方法名,动态调用这个类的对应方法
Class targetClass = NSClassFromString(@"ViewController");
id target = [[targetClass alloc] init];
SEL action = NSSelectorFromString(@"fun");
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:action];
#pragma clang diagnostic pop
//3句#pragma *** 用于去掉编译器警告
当然,runtime的具体应用和原理还是比较复杂的,除了去看一大堆文档,我没发现什么捷径可以快速学习。
其实写这篇文章的主要目的,是为了给下一篇文章:“ios业务模块间互相跳转的解耦方案”做技术铺垫。如果你读完了这篇文章,不妨去看看,相信会有收获的 ^^。链接地址:
http://mp.weixin.qq.com/s?__biz=MzIxNDI0OTAzOQ==&mid=403079862&idx=1&sn=a2ebc5a3afbd80d034c371f70bfa06d4#rd
对于runtime详细的原理和描述有很多人写过了,我就不写了,找了几篇比较不错的链接:
苹果的官方文档:
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/index.html
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html
从源代码的角度分析了runtime的具体实现:
http://www.jianshu.com/p/25a319aee33d
runtime的应用场景和实例:
http://blog.csdn.net/jasonblog/article/details/7246822
http://www.cocoachina.com/ios/20160128/15154.html
*转载请包涵以下内容
欢迎大家关注我:iDevShare
或加我微信:lofocus