2012-08-07 36 views
6

由於目標C爲C超集,所有的Objective-C特定語句一個.m文件的編譯時轉化成C語句(由預測器,我猜)。因此,例如,將消息表達式[receiver method]轉換爲消息功能objc_msgSend(receiver, selector)上的呼叫。什麼是一個Objective-C 2.0類接口和實現轉換成GCC或鏘

我的問題是:如果我有一個類定義是這樣的:

@interface ClassA { 
    int var1; 
    float var2; 
    id var3; 
} 

-(void) method1; 
-(int) method2: (int) num1; 
@end 

@implementation ClassA 
-(void) method1 { 
    // Implementation of the method 
} 

-(int) method2: (int) num1 { 
    // Implementation of the method 
} 

@end 

是什麼轉換成由編譯器(2.0版本的Objective-C的)?它是轉化爲電話上的功能,如objc_allocateClassPair()class_addIvar()class_addMethod()objc_registerClassPair(),以分別創建類,添加它的實例變量,增加它的方法和註冊類,(所以該類結構在運行系統中實際定義的,而不是從可執行文件加載爲結構體)?

回答

14

由於目標C爲C超集,所有的Objective-C特定語句 被一個.m文件的編譯(由 預處理器,我想)時轉化成C語句。

,在1988年是真實而Objective-C的可以仍然以那種方式編譯,它一直沒有在很長一段時間。

編譯器解析的Objective-C,其中C而且 - sometimes-- C++一起,並且發射一個抽象語法樹[AST],它表示後預處理輸出。 AST非常直接地包含了各種Objective-C定義。

注意,GCC的編譯和LLVM的編譯的細節分歧。

如果您查看編譯後的輸出,您會看到mach-o文件(可執行產品)在文件中包含Objective-C元數據的各個部分,包括類定義,選擇器表,伊娃佈局等...編譯器將這些元數據生成到.o文件中,然後鏈接器將它們全部混合在一起,消除重複信息(這不是重複的符號)並寫入mach-o。

正如有人在另一個問題中提到的那樣,您可以使用Objective-C重寫器將Objective-C重寫爲直C,但生成的代碼效率低下,並且與規則編譯管道有很大不同。