Objective C 教程 @Part-01

● 什麼是Objective-C

1980年代初,Brad Cox 與 Tom Love 在其公司 Stepstone 發明 Objective-C,並以一種叫做 SmallTalk-80 的語言為基礎。Objective-C 建立在 C 語言之上,意味著它是在 C 語言基礎上添加了擴充功能而創造出來能夠建立和操作物件的一門新的程式語言(即物件導向)。1988年NeXT Computer 公司獲得了 Objective-C 語言的授權,並開發出了 Objective-C 的函式庫和一個名為 NEXTSTEP 的開發環境。1992年,自由軟體基金會的 GNU 開發環境增加了對 Objective-C 語言的支援。1994年NeXT Computer 公司和 Sun Microsystem 聯合發行了一個針對 NEXTSTEP 系統的標準典範,名為 OPENSTEP。OPENSTEP 在自由軟體基金會的實作名稱為 GNUstep1996年12月20日蘋果公司宣布收購 NeXT Software 公司,NEXTSTEP/OPENSTEP 環境即成為蘋果作業系統 OS X 主要開發基礎,而這個開發環境被蘋果公司稱為 Cocoa

開發環境

再開始準備學習程式語言架構前,第一件事就是開啟空白純文字檔,開始寫第一行"hello world" ,並交由命令提示字元 or 終端機下指令碼編譯並執行程式 . 在純文字模式有了基礎概念後往往在開發過程程式碼越來越肥大複雜化,此時人們開始偷懶,開始依賴支援該語言的IDE,IDE說穿了就是個當我們在寫程式時,替我門處理掉許多瑣碎雜事與幫助開發者快速找出程式Bug所在,讓原本純文字模式下許多重複性的動作大大縮減。例如我們常將變數名稱大寫打成小寫,又或者少打一個英文字母,聰明的 IDE通通幫你找出來,另外IDE還包含了應用程式框架提供使用,例如UIButton(按鈕) 、UIScroller(卷軸) … 等。
既然IDE是程式開發者少不了的工具,在開發Mac / iPhone / iPad 等Apple公司下的相關應用程式,當然也會提供開發者一套強大的開發工具XCode。在此提供兩種路徑下載 :

一 : 直接開啟Mac電腦上iStore應用程式並在搜尋Bar上輸入XCode進行下載
二 : 連接此網址進入開發工具下載頁面(最後還是會啟動Mac App Store進行下載) http://itunes.apple.com/us/app/xcode/id497799835

前言

♦ 在一般的語言裡通常用” . ”來做鍵接,而在Objective C上則以一個空白字元做鍵接,再以一組"[ ]"與之包覆。以下將舉A 呼叫 B動作來驗證Objective C和一般語言上的差異:
      @一般語法 : A.B
      @Objective C語法 : [A B]

♦ 在Objective C的世界裡,變數(variable)除了基本型別 如 int , double , char ..等,其他都是指標型態 ,這意味著程式設計師不僅要將整個應用程式架構完善外,還要撥出大半時間處理記憶體釋放,而這往往是用慣了Java,C#,VB,AS等無須管控記憶體釋放的程式人員最頭痛的問題。

 布林值(Boolean)在一般語言的表示方法為 true & false ,在 Objective C 則由 YES & NO 表示真假附註: Objective C 使用true & false 編譯也正確

 空值在一般語言將呈現NULL,而Objective C 則用 nil 呈現。附註: Objective C 使用null編譯也正確

♦ 一般直觀的Class類別由單一個文件檔即可完成,但在 Objective C 環境下一個物件將分成兩等份 .h檔(標頭檔) & .m檔(實作檔),此兩份文件檔為一個物件

 以下將開始 Objective C 程式語法範例教學,假設你有其他程式語言基礎你只會感到一點點的困惑,但如果你是位沒接觸過程式語言甚至看到程式碼還是會害怕的人,以下內容將讓你感到痛苦萬分,所以建議您先從其他簡單的基礎語言學起。

● 第一個Objective C Class

@interface


#import <Foundation/Foundation.h>

@interface Counter : NSObject{
 int m_firstNumber;
 int m_secondNumber;
}
-(void)setFirstNumber:(int)num;
-(void)setSecondNumber:(int)num;
-(int)getFirstNumber;
-(int)getSencondNumber;
@end

  • 一個Objective物件由.h(標頭檔)與.m(實作檔)兩個檔案組成,@interface即為.h檔的開頭宣告.
  • 宣告此類別名稱為Counter並繼承NSObject物件.NSObject為iOS框架(framework)的基底.
  • { }區塊內主要用來宣告此物件所需的全域變數
  • 在最下方宣告了尚未實作出來的四個方法,Objective C回傳值宣告方式為 ~-(回傳型別)~,如無需回傳值則填入void.而接在方法名稱後面的怪異文字 ~:(傳入型別)變數名稱~,即為呼叫此方法時所需帶入的參數.
  • 完成後在最後一行以@end宣告結束。

@implementation


#import "Counter.h"

@implementation Counter

-(void)setFirstNumber:(int)num
{
 m_firstNumber = num;
}
-(void)setSecondNumber:(int)num
{
 m_secondNumber = num;
}
-(int)getFirstNumber
{
 return m_firstNumber;
}
-(int)getSencondNumber
{
 return m_secondNumber;
}
@end
  • 一開頭即先使用#import 將我們剛剛製作完成的Counter.h引入,並在此將所有方法實作完成.
  • implementation即為剛才所提到的.m檔宣告,在實作檔中必須將所有.h檔內所宣告的方法實作完成.
  • 其餘內容為實作Counter.h內所有方法.實作完成在最後一行與interface一樣以@end宣告結束。

@main


#import <Foundation/Foundation.h>
#import "Counter.h"

int main(int argc, const char * argv[])
{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

 Counter *counter = [[[Counter alloc] init] autorelease];
 [counter setFirstNumber:10];
 [counter setSecondNumber:999.88];
 NSLog(@"取出counter物件第一個數值為: %d",[counter getFirstNumber]);
 NSLog(@"取出counter物件第二個數值為: %.2f",[counter getSecondNumber]);

 [pool drain];
}

®輸出結果 :

取出counter物件第一個數值為: 10 
取出counter物件第二個數值為: 999.88
  • 每個語言架構在執行時,都會有一個程式主入口,而Objective C和其他部分語言一樣採用main當程式入口。
  • 在主程式中我們如果要引用其他自訂物件,必須在開頭使用 #import “自訂義物件.h" 將其匯入使用。如欲載入的是iOS內定框架則外括弧須採用 < >。
  • NSAutoreleasePool是管控記憶體釋放池的重要關鍵,因記憶體管理機制需要進一步在後段教學裡驗證,所以現在暫時不多做解釋。
  • 內容我們宣告了一個自訂義物件Counter型別的指標物件,並直接做初始化。
  • 在Objective C 裡完整的初始化物件寫法分別解釋為 – alloc: 依物件行別配置記憶體區塊  init: 初始化元件  autorelease :加入記憶體釋放池。 PS : 現在如果還是有點模糊沒有關係,在後段的記憶體管理會完整分析過程,目前你只要知道[[[Counter alloc] init] autorelease]這一行的意思是配置一塊Counter物件大小的記憶體空間並且做初始化即可,如果對有程式觀念的人來說,這行的意思就像是其他語言的 “new"。
  • Objective C呼叫物件方法為 : [指標物件 欲呼叫的方法名稱 : 傳入的值];,舉其他語言例子來說和 object.method(val) 是一樣的意思。
  • NSLog此函式是用來在本機Concole端輸出字串,多數用來證明語法語Debug使用,內容開頭須以 @ 為起頭,字串以""包覆,’ % ‘格式化文字的部分與C語言相同,不做贅述。

● 建構子初始化(Constructor)

呈上所提到的init初始化物件,現在將實現帶入參數做物件初始化。簡易來說就像是你在生成一個物件來使用的當下,物件會依你傳入的參數做為參考並改變初始內容。以下做簡易示範:

@interface

#import <Foundation/Foundation.h>

@interface Person : NSObject{
   NSString *m_name;
   int m_age;
   int m_studentID;
}
-(id)initWithName:(NSString*)name andAge:(int)age andID:(int)ID;
-(void)setStudentName:(NSString*)name;
-(void)setStudentAge:(int)age;
-(void)setStudentID:(int)num;
-(void)showStudentInfo;

@end
  • 建立起一個學生人物的物件Class,裡面包含了三個屬性成員->姓名,年齡,學號。 
  • NSString為Objective C的字串物件,在Objective C裡除了基本型別外只要是物件型別通通都要以指標表示,同時也意味著一經初始後,最後仍須釋放記憶體。PS:指標變數宣告須在變數名稱前加上 ‘ * ’
  • 宣告五個方法提供外部呼叫。PS : 方法如需傳入多參數寫法如下 (傳入型別)參數名 (傳入型別)參數名 …

@implementation

#import "Person.h"

@implementation Person

-(id)initWithName:(NSString*)name andAge:(int)age andID:(int)ID
{
   [super init];

   m_name = name;
   m_age = age;
   m_studentID = ID;

   return self;
}
-(void)setStudentName:(NSString*)name
{
   m_name = name;
}
-(void)setStudentAge:(int)age
{
   m_age = age;
}
-(void)setStudentID:(int)id
{
   m_studentID = id;
}
-(void)showStudentInfo
{
   NSLog(@"學生姓名 : %@ 年紀 : %d 學號 : %d",m_name,m_age,m_studentID);
}
@end
  • 在此我們客制化定義了一個方法做為初始化物件方法,首先-(id)回傳型別為任意型別,在方法名稱隨要求了三個做為定義資料的參數。
  • 建構子最關鍵的地方[super init],別忘了我們的物件都繼承了NSObject這個老爸,所以super代表呼叫父類別的關鍵字,而init當然就是你老爸NSObject的建構子。在此順帶一提在Objective C裡的物件框架設計不論你繼承了什麼物件,其最基底都由它"NSObject"做為根基。
  • 在建構子方法內將所有變數初始化完成後,即以 self 回傳自己的位址。簡單說就是把自己的記憶體位置回傳給呼叫此方法的人,接收到後在把接收到的記憶體位址指向宣告的指標變數以供使用。

@main

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[])
{
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

   Person *person_1 = [[Person alloc] init];
   [person_1 setStudentName:@"叮叮"];
   [person_1 setStudentAge:22];
   [person_1 setStudentID:88779];

   Person *person_2 = [[Person alloc] initWithName:@"噹噹" andAge:25 andID:66993];

   [person_1 showStudentInfo];
   [person_2 showStudentInfo];

   [pool drain]; //將記憶體儲存池清空
}

®輸出結果 :

 學生姓名 : 叮叮 年紀 : 22 學號 : 88779
 學生姓名 : 噹噹 年紀 : 25 學號 : 66993
  • person_1以最原始的方式作初始化物件,但僅僅是生成物件並沒有對任何物件內的變數做初始動作,故隨後需個別做資料設定。
  • person_2使用Person該類別的客制化初始方法做生成物件的動作並給與其需要的變數初始參數。
  • 最後將兩者的人物訊息印出驗證,得到相同的結果。
廣告

One Response to Objective C 教程 @Part-01

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: