基本上 Objective-C 為 C 語言的擴充,因此 C 語言程式都可用 Objective-C 的編譯器 (compiler) 編譯。 Objective-C 程式編譯成執行檔後,必須在執行環境(或稱底層虛擬機器)下才可執行,目前常見的編譯器為 Clang ,其執行環境為 LLVM 。
使用 GCC 也可直接編譯 Objective-C 程式,相對執行環境須改為 GNUstep 。如果使用 Mac 作業系統,就可安裝官方的 Xcode 整合開發環境,然後直接使用 Xcode 編譯。
Xcode 3.2 之前是採用 GCC 當編譯器,之後的版本採用 Clang 。
接下來我們以一個簡單的小程式說明 Objective-C 的基本概念 :)
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog(@"\n\nHello, World!\n\n\n"); [pool drain]; return 0; } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:simple.m 功能:簡單的程式範例 作者:張凱慶 時間:西元 2013 年 4 月 */
Objective-C 程式的原始碼 (source code) 副檔名為 .m ,在 Xcode 的專案建立如下
點擊 Build and Go 就可編譯,如果沒有自動跳出執行結果,找到圖中的 simple 用滑鼠點兩下就可執行
我們現在來逐行看看這個簡單範例,首先,第 1 行
#import <Foundation/Foundation.h>
#import 為前置處理的指令,這一行是從 Cocoa 中引入標頭檔 (header file) Foundation.h 中所宣告的內容, Foundation.h 裡頭搭載 Cocoa 提供給 Objective-C 的基礎物件 (object) ,注意這裡的寫法, < 之後加上 Foundation ,然後 / ,然後才是 Foundation.h ,最後是 > 。
接下來是函數 (function) main() , main 為函數名稱,小括弧裡頭為參數列 (parameter list) ,後面的大括弧圍起來的範圍則是函數內容
int main(int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog(@"\n\nHello, World!\n\n\n"); [pool drain]; return 0; }
函數為 Objective-C 獨立的執行單位,可以提供參數 (parameter) 進行運算,也可以回傳運算結果,而 main() 是個特別的函數名稱,所有可值行的 Objective-C 程式都要有個 main() ,因為這是程式執行的起點。我們的 main() 基本上是把 Xcode 提供的預設程式稍作修改。
從第 3 行可以看出 main() 回傳 int 型態的整數,並且有兩個參數,這兩個參數都跟命令列有關,由於我們直接用 Xcode 編譯執行,所以就保留下來就好
int main(int argc, const char * argv[]) {
底下是建立記憶體自動釋放池物件,這是舊版 Xcode 的寫法
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog(@"\n\nHello, World!\n\n\n"); [pool drain];
新版 Xcode 的寫法為
@autoreleasepool { NSLog(@"\n\nHello, World!\n\n\n"); }
我們在這一份《快速導覽》中先採舊版 Xcode 的寫法,日後會再補上新版寫法當對照。
Objective-C 建立物件是透過傳遞訊息,儲存物件必須用指標 (pointer) 變數 (variable) ,凡是變數使用前都要先宣告 (declare)
NSAutoreleasePool *pool;
pool 為變數的識別字 (identifier) 名稱,星號 * 表示這是個指標, NSAutoreleasePool 則是 pool 的型態 (type) 。
接著用等號 = 表示的指派運算子 (assignment operator) ,這是把等號左邊取得的值給右邊的變數,此處是向 NSAutoreleasePool 傳遞 alloc 訊息,其回傳值 (return value) 再傳遞 init 訊息,最後的回傳值儲存在 pool 之中
pool = [[NSAutoreleasePool alloc] init];
這樣就建立記憶體自動釋放池物件了,最後程式執行前,再向 pool 傳遞 drain 訊息,好完成釋放記憶體的動作
[pool drain];
中間所進行的工作,就只有呼叫 NSLog() 函數,這是用來在命令列輸出訊息用的,參數是 NSSting 型態的字串 (string)
NSLog(@"\n\nHello, World!\n\n\n");
有沒有看到很多 NS 的前綴呢? NS 是為了區別 C 語言原有的定義而加入的前綴, C 語言定義雙引號圍起來的內容為字串,基本上這屬於字元陣列 (array) , Objective-C 需要字串物件,就改成加上 @ 的雙引號,而這屬於 NSString 型態。裡頭我們看到的 \n ,這是跳脫序列的新行字元,表示命令列遇到 \n 就斷行。
大體上這個範例就是相當簡單的 Objective-C 程式,我們的重點會放在使用 Objective-C 的部份,至於 C 語言的其他相關特性請參考《C 語言快速導覽》。
中英文術語對照 | |
---|---|
程式語言 | programming language |
物件導向 | object-oriented |
程式 | program |
編譯器 | compiler |
原始碼 | source code |
標頭檔 | header file |
物件 | object |
函數 | function |
參數列 | parameter list |
參數 | parameter |
指標 | pointer |
變數 | variable |
宣告 | declare |
識別字 | identifier |
型態 | type |
指派運算子 | assignment operator |
回傳值 | return value |
字串 | string |
陣列 | array |
您可以繼續參考
基本概念
標記
基本資料型態與指標
相關目錄
Objective-C 快速導覽
Objective-C 教材
首頁
參考資料
Programming with Objective-C: About Objective-C
Programming with Objective-C: Working with Objects
沒有留言:
張貼留言