runtime是OC这门动态语言的灵魂,想要在这门语言上有更深的理解和发展,必须要深入理解runtime。
搜罗了一些描述比较好的资料:
因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时。也就是说只有编译器是不够的,还需要一个运行时系统 (runtime system) 来执行编译后的代码。这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一块基石。
RunTime简称运行时。OC就是运行时机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数。对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效而作出的努力。你可以在这里下到苹果维护的开源代码。苹果和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。
下面是写的比较不错的关于runtime的文章,供大家相互学习:
http://www.cocoachina.com/ios/20150901/13173.html
提供一个比较简单用法:
拿UIImage为例
写一个UIImage的类别,导入相关头文件 #import <objc/runtime.h>
//在load里面用我们自己定义的 myImageWithName替换掉 Image的imageNamed方法,
+(void)load
{
Method myMethod =class_getClassMethod([UIImageclass],@selector(myImageWithName:));
Method method =class_getClassMethod([UIImageclass],@selector(imageNamed:));
method_exchangeImplementations(myMethod, method);
}
//并实现这个方法
+(UIImage *)myImageWithName:(NSString *)name
{
UIImage * image = [UIImagemyImageWithName:name];
return image;
}
在以后使用 imageNamed:方法的时候,就会自动替换成我们自己定义的方法,这个例子通常使用在已经成型的项目需要大量修改某一个自定义或者系统的方法的时候,可以通过runtime偷梁换柱。