Objective-C 入門指南 - 訊息傳遞

不同於 C++ 的呼叫成員函數 (member function) 或 Java 的呼叫方法 (method) , Objective-C 採用傳遞訊息 (message passing) 的模式




上圖對 Java 來說為兩個不同的參數 (parameter) 版本,用 Java 會寫成
object.message(p1);
object.message(p1, p2);


在 Objective-C ,我們說第一個為對 object 傳遞 message: 訊息 (message) ,第二個為對 object 傳遞 message:andMessage: 訊息,冒號後表示需要接參數,至於 object 則為訊息的接收者 (receiver) 。


呼叫方法與訊息傳遞的主要差異除了語法之外,還有就是 C++ 的成員函數或 Java 的方法都在編譯期 (compile time) 被綁定,編譯時碰到不符的內容就會發生編譯錯誤 (compile error) ; Objective-C 在執行期 (runtime) 才會動態決定如何處理訊息,無法處理才會拋出例外 (exception) 。這使 Objective-C 延續 C 語言的簡單,卻又更具有彈性。


demo.m 中的 pool ,便是由 NSAutoreleasePool 繼承 (inherit) 自 NSObject 的類別方法 (class method) alloc 配置記憶體空間,也就是先向 NSAutoreleasePool 類別傳遞 alloc 訊息, alloc 之後已經有了實體物件,因此再由 NSObject 的實體方法 (instance method) init 初始化,最後藉由指派運算子 (assignment operator) 將指標 (pointer) 儲存到 pool
// 建立自動釋放池物件, alloc 為配置記憶體區域, init 為初始化物件
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


接著建立完 s1s2s3 三個 NSString 物件 (object) 後,各自傳遞 autorelease 訊息,告訴 pool 不再使用 s1s2s3 後,就釋放所屬的記憶體空間
// 傳遞 autorelease 訊息給 NSString 字串物件
[s1 autorelease];
[s2 autorelease];
[s3 autorelease];


下面向 s1 連續傳遞兩次 stringByAppendingString: 訊息,第一次以 s2 當參數,第二次以 s3 當參數,並且將回傳的指標指派到 s1 之中
// 傳遞 stringByAppendingString 訊息給 s1 ,並以 s2 當參數
// 這是將 s2 接到 s1 的後頭,因此 s1 與 s2 會合併為一個字串
s1 = [s1 stringByAppendingString: s2];
// 以下為將 s1 與 s3 合併為一個字串
s1 = [s1 stringByAppendingString: s3];
// 呼叫 NSLog() 函數,印出 s1 的內容


程式的最後傳遞 drain 訊息給 pool ,告訴 pool 可以將自動釋放池中的物件釋放掉
// 傳遞 drain 訊息給自動釋放池物件
[pool drain];


有沒有覺得訊息傳遞在語意上更清楚呢?接下來我們來詳細討論一下NSString吧!


中英文術語對照
成員函數member function
方法method
傳遞訊息message passing
參數parameter
接收者receiver
編譯期compile time
編譯錯誤compile error
執行期runtime
例外exception
繼承inherit
類別方法class method
實體方法instance method
指派運算子assignment operator
指標pointer
物件object


您可以繼續參考
基礎篇


相關目錄
Objective-C 入門指南
Objective-C 教材
首頁



參考資料
Learning Objective-C: A Primer
The Objective-C Programming Language
Cocoa Fundamentals Guide
Coding Guidelines for Cocoa
Advanced Memory Management Programming Guide
Archives and Serializations Programming Guide

沒有留言: