[iOS Tutorial] 2 簡介 Objective-C 的力與美

八月 15, 2012  Comments by

Objective-C 是一個完全物件導向的語言,實際上  Objective-C 是 C 的 super set (也就是說在原有的 C 上面再多一點點東西),為了讓大家快速了解 Objective-C 的特性,我們直接從 public/private v.s. method/property 這四個關鍵字的組合切入主軸。然後記得一件事,Objective-C 只有 Object,所有的東西都放在 heap

宣告與實作

  • header file 副檔名為 .h,source file 副檔名為 .m
  • 宣告在 header file,實作在 source file
  • public method 在 header file,private method 在 source file
  • public property 在 header file,private method 在 source file

Objective-C 在語法上與 C 語言其實都大同小異,把握幾個重點即可,宣告/實作以 @interface/@implementation 起始,@end 結尾,標頭檔以 #import 為關鍵字,其實這也不用記,因為在新增類別 (Class) 的時候 Xcode 就自動把 .h/.m 產生好了。唯一要注意的就是 private method 的宣告放在 .m (source file) 裡頭,並以 @interface xxxxxxx() 開頭,@end 結尾。

method 語法

  • C v.s. Objective-C (declaration):
    void orbitPlanetAtAltitude (Planet *aPlanet, double km);
    – (void)orbitPlanet: (Planet *)aPlanet atAltitude: (double)km;
  • C v.s. Objective-C (implementation):
    void orbitPlanetAtAltitude (Planet *aPlanet, double km){…}
    – (void)orbitPlanet: (Planet *)aPlanet atAltitude: (double)km {…}

在 Objective-C 最讓人腦筋轉不過來的語法就是 method (還有 message) 的部分,只要把握2個原則

  1. 每個參數都有名字
  2. 左右小括弧

什麼是 message

還記得前一篇文章我們特別在一開始就提到 message 的概念:

Message (sent to object to make it act) – 通常 obj.doSomething() 的行為我們稱為 obj 呼叫 doSomething();在 Objective-C 寫做 [obj dosomething],我們稱傳送一道 doSomething 訊息給 obj。

雖然在行為上我們可以暫時看做呼叫某個 method 做某件事,但是在整個概念上,Objective-C 物件運作的方式是比較接近 LISP 語言的,以下程式片段更容易體會其中的差異:

  • UIImage *image = new UIImage (“photo.png");
    UIImageView *imageView = new UIImageView (image);
    delete image;
    // dosomething
    delete imageView;
  • UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"photo.png"]];
    // dosomething

property

如果我只有3分鐘告訴你什麼是 property,我會這樣說「property 就是 Xcode 自動產生 getter 和 setter method 讓你存取類別 (Class) 中的變數」,如果我有半小時,我會說「property 提供一個很好的封裝機制保護你的變數和隱藏你的做法」,如果我有半天的時間,會說「好的 property 寫法讓你減少犯錯的機會,隱藏複雜的實作並且讓你的語意更清楚,同時還提供一套明顯的記憶體保護機制。前提是你要會用」。

  • @property (nonatomic) double topSpeed; // in header file, declaration setter and getter method
  • @synthesize topSpeed = _topSpeed; // in source file, auto generating setter and getter for you

以上圖為例,.h/.m 各一行就自動產生了 setter – (void)setTopSpeed:(double)speed { _topSpeed = speed;}getter – (double)topSpeed { return _topSpeed;} 這一組 method。如果你想用自己的 setter (想要比預設的 setter 做更多事),可以直接在 source file 上補上,一但 Xcode 發現你有自己的 setter 或 getter,@synthesize 就不會自動幫你產生。例如下圖產生自己的 setter – (void)setTopSpeed:(double)speed { if ((speed < 1) && (speed > 0)) _topSpeed = speed;}

具備了以上的基本常識之後,是不是覺得 iOS App 的開發似乎沒有想象中的門檻那麼高,下一篇文章會用更多篇幅探討 Objective-C 的語法,在這之前可以先參考 CS193P Lecture 2 的講義 (Walkthrough iOS 5) 或影片 (2. My First iOS App (September 29, 2011) – HD),教大家怎麼"拉出"第一個 iOS Application 與 Xcode 工具的基本操作。

iOS 入門教學

About the author

喜愛攝影、自助旅行、一邊宅在家帶小孩一邊創業的 App 設計師。