理解 Objective-C Runtime
當人們初學 Cocoa/Objective-C 時,Objective-C Runtime 是被忽略的特性之一。原因是 Objective-C(這門語言)很容易在幾小時內就熟悉,新學 Cocoa 的人花費他們大部分的時間學習 Cocoa 框架和適應它是如何工作的。然而每個人至少應該知道一些 runtime 的工作細節,需要比知道編譯器會把 [target doMethodWith:var1]; 轉換為 objc_msgSend(target,@selector(doMethodWith:),var1); 更深入一些。知道 Objective-C 正在做的會讓你更深入的理解 Objective-C 和你正在執行的 app。我認為 Mac/iPhone 的開發者不管你現在是什麼水平,都會有收穫的。
Objective-C Runtime 是開源的
Objective-C 是開源的,任何時候你都能從 http://opensource.apple.com. 獲取。事實上檢視 Objective-C 原始碼是我理解它是如何工作的第一種方式,在這個問題上要比讀蘋果的文件要好。你可以下載適合 Mac OS X 10.6.2 的 objc4-437.1.tar.gz。(譯註:最新objc4-551.1.tar.gz)
動態 vs 靜態語言
Objective-C 是面相執行時的語言(runtime oriented language),就是說它會盡可能的把編譯和連結時要執行的邏輯延遲到執行時。這就給了你很大的靈活性,你可以按需要把訊息重定向給合適的物件,你甚 至可以交換方法的實現,等等(譯註:在 Objective-C 中呼叫一個物件的方法可以看成向一個物件傳送訊息, Method Swizzling 具體實現可以參看
1 2 3 4 5 6 |
#include
int main(int argc, const char **argv[])
{
printf( "Hello World!" );
return 0;
}
|
編譯器解析,優化然後把優化後的程式碼轉成彙編:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
.text
.align 4,0x90
.globl _main
_main:
Leh_func_begin1:
pushq %rbp
Llabel1:
movq %rsp, %rbp
Llabel2:
subq $16, %rsp
Llabel3:
movq %rsi, %rax
movl %edi, %ecx
movl %ecx, -8(%rbp)
movq %rax, -16(%rbp)
xorb %al, %al
leaq LC(%rip), %rcx
movq %rcx, %rdi
call _printf
movl $0, -4(%rbp)
movl -4(%rbp), %eax
addq $16, %rsp
|