使用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語句返回。

發佈了38 篇原創文章 · 獲贊 13 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章