上圖對 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];
接著建立完 s1 、 s2 、 s3 三個 NSString 物件 (object) 後,各自傳遞 autorelease 訊息,告訴 pool 不再使用 s1 、 s2 、 s3 後,就釋放所屬的記憶體空間
// 傳遞 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
沒有留言:
張貼留言