Objective-C作为一门动态编译语言,会将编译和连接时要做的事情推迟到运行时。这代表着OC语言不仅仅需要一个编译环境,同时也需要一个运行时系统来执行编译好的代码。
也可以这样理解:“运行时系统(runtime)扮演的角色类似Objective-C语言的操作系统,Objective-C基于该系统来工作”。
一.静态语言和动态语言的区别
1.静态语言如下
#include < stdio.h >
int main(int argc, const char **argv[])
{
printf("Hello World!");
return 0;
}
静态语言执行过程:经过编译器的语言分析,优化然后将你最佳化的代码编译成汇编语言,然后完全按照你的设计逻辑和代码自上而下的执行。
2.动态语言Objective-C
[receiver message]
objc_msgSend(receiver, selector)
objc_msgSend(receiver, selector, arg1, arg2, …)
Objective-C语言执行过程:消息只有到运行时才会和函数实现绑定起来,而不是按照编译好的逻辑一成不变的执行。
一.介绍下动态语言
1.runtime确实是开源的。
目前苹果公司和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。
下载地址
2、runtime是由C语言实现的
runtime做为Objective-C最核心的部分,几乎全部由C语言实现。这里的“几乎”所指的例外就包含有的方法(比如下面要说道的objc_msgSend方法)是用汇编实现的。
3.runtime的两个版本
runtime其实有两个版本:"Modern(现行)"和"legacy(早期)"。
Objective-C 2.0 之后采用的是Modern版的 runtime系统,只能运行在 iOS 和 OS X 10.5 之后的64位程序中。
而OS X较老的32位程序仍采用 Objective-C 1中得(早期) Legacy 版本的 runtime系统。
这两个版本最大的区别在于当你更改一个类的实例变量的布局时,在早期版本中你需要重新编译它的子类,而现行版本就不需要。