2012-04-11 97 views
1

我知道客觀的C是C的嚴格超集,我們寫的是同樣的東西。 但是,當我寫Objective-C在編譯之前轉換爲C代碼嗎?

@interface Myintf {} 
@end 

是否得到轉換爲C結構或者是它的是用於通過目標c編譯準備的數據結構Myintf內存佈局是一樣的,一個C結構的在runtime.h定義?

和同樣的問題有關objc_msgsend

蘋果文件說

在Objective-C,消息不綁定到方法的實現,直到運行時。 編譯器將消息表達式轉換爲消息傳遞函數objc_msgSend上的調用。該函數將接收器和中提到的方法的名稱信息,也就是說,該方法選擇器作爲它的兩個主要參數:

回答

3

是否得到轉換爲C結構

在過去,它曾經,但與現代的運行時間(OS X 10.5以上64位和iOS),我認爲這是多一點複雜。它不能使用傳統的struct,因爲Fragile Instance Variable問題已解決。

和同樣的問題有關objc_msgsend

是。所有方法調用 - 或者更準確地說,所有消息發送 - 都被轉換爲對obj_msgsend()的調用(當使用不同的C函數時,super被用作接收器時除外)。

請注意Objective-C的早期實現是作爲預處理器實現的,並生成C源代碼作爲中間步驟。現代編譯器不打擾這一點,直接從Objective-C源代碼轉換爲目標代碼格式。

2

NO和NO。這兩種情況最終都依賴於運行時。在某種程度上,它被轉換爲使用C接口,但引入了一個抽象層次 - 它不完全是靜態的。

這將有助於查看編譯器生成的程序集,以瞭解它如何更詳細地工作。

鑑於聲明:

id objc_msgSend(id theReceiver, SEL theSelector, ...); 

編譯器插入一個電話objc_msgSend當你實現調用的方法。它不是簡化爲一個靜態的C函數調用,而是動態調度 - 如果你喜歡這樣想的話,又是另一個間接的層次。