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系統。
這兩個版本最大的區別在于當你更改一個類的實例變量的布局時,在早期版本中你需要重新編譯它的子類,而現行版本就不需要。