Objective-C 快速導覽 - 基本概念

Objective-C 是在 C 語言的基礎上發展出來的程式語言 (programming language) ,使 C 語言也能使用物件導向 (object-oriented) 的觀念寫程式 (program) , Objective-C 為目前 Mac OS 與 iOS 相關應用程式的主力開發語言。



基本上 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

沒有留言: