天天看點

使用clang指令行工具編譯連結Objective-C應用程式

Objective-C程式設計語言是一種面向對象的進階程式設計語言,可以用它編寫基于Mac或者iOS系統的應用程式。

閑言少叙,下面我們建立一個Hello World程式,了解一下最基本的Objective-C程式的寫法。打開任何文本編輯工具,例如系統的“文本編輯”工具(應用程式 -> 文本編輯),或者在終端中使用vi指令都可以。這裡以文本編輯工具為例,在其編輯區中輸入下面的代碼:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    @autoreleasepool
    {
        printf("Hello, World!\n");
        NSLog(@"Hello, Objective-C!");        
    }
    return 0;
}
           

然後按下⌘S儲存,注意需要将其儲存為純文字格式,檔案名及其存放路徑可以随意,例如test.m。Objective-C程式的源代碼檔案字尾為.m,頭檔案字尾是.h。接下來我們可以在Xcode中或者系統終端中對程式進行編譯連結,生成可執行檔案。這裡以指令行方式為例,打開終端(應用程式 -> 實用工具 -> 終端),并通過cd指令進入到test.m檔案所在的目錄,然後需要使用clang工具對上述程式進行編譯連結。在iOS 5之前,我們可以通過gcc工具對源代碼進行編譯連結,但是由于iOS 5中添加了新的特性,例如ARC以及新的指令,是以需要使用LLVM clang編譯器。如果你還使用老的gcc,是無法通過編譯的,因為它并不認識源代碼中新的指令。

在終端中輸入如下指令:

$ clang -fobjc-arc -framework Foundation test.m -o test
           

這裡的$符号是終端指令提示符,并不是輸入的内容。-fobjc-arc表示編譯需要支援ARC特性,這樣才能夠了解新添加的指令。-framework Foundation表示引用Foundation架構,這個架構中定義了很多基本的類,例如字元串、數組、字典等等。其作用類似于我們做飯中的各種食材,脫離了食材就沒法做飯。後面的test.m就是待編譯的源代碼檔案名。-o test表示輸出的可執行檔案的檔案名是test。

編譯連結之後會在目前目錄生成test,我們接下來就可以在終端中執行該檔案,輸入如下指令:

$ ./test
           

回車之後可以在終端中得到如下輸出:

Hello, World!
2012-02-24 16:46:37.532 test[75632:707] Hello, Objective-C!
           

下面解釋一下test.m檔案中的代碼含義。第1行使用#import指令導入Foundation架構的頭檔案Foundation.h,引用了該頭檔案之後才能夠使用Foundation架構中定義的各種基礎類。如果你學過C和C++,你一定知道#include,它也是用于導入頭檔案。為了防止多次導入同一個頭檔案,在使用#include指令時還需要配合使用ifdef等條件指令,判斷目前是否已經導入了該頭檔案。但現在好了,#import比#include的優越之處在于,#import保證指定的頭檔案至多導入一次,不會發生多次導入同一個頭檔案的問題。

之後定義了一個C函數main,它作為程式的入口點。其函數聲明與C語言中的main函數完全一樣,argc參數儲存了指令行的參數個數(包括指令本身),argv是一個C字元串數組,儲存了每個輸入的參數的字元串。

接着,在main函數體中,首先使用@autoreleasepool指令定義了一個自動釋放域,它用于釋放之前申請的記憶體空間,現在我們可以先不關注它。

然後main函數使用C語言中的printf函數輸出了一個C字元串"Hello, World!\n",然後又調用了NSLog函數輸出了一個Cocoa字元串@"Hello, Objective-C!"。看上去這兩個字元串很類似,但是實際上他們的差别非常大。前者是一個C字元串char*,一個以0結尾的字元數組。後者以@字元開頭,它是Cocoa字元串對象,一個NSString類型的對象。C字元串基本上沒有提供任何功能,而NSString是Foundation架構中定義的字元串類,它提供了非常多的字元串操作功能,例如獲得字元串的長度,查找某個子字元串的位置,判斷兩個字元串的内容是否相同,擷取某個位置的字元等等。是以在使用字元串時我們絕大多數都會使用NSString對象。

最後程式使用return語句傳回。

繼續閱讀