2012年4月25日 星期三

Objective C 學習隨記(二)

objC 跟C 雖然是很類似的程式語言, 但是用慣了C 寫一些firmware的人要轉學objC 還是有一些觀念要適應一下! 下面介紹的就是一個objC專有的語法, 如果能靈活運用, 將省去不少重複的程式

同名異式

動態型別

動態連結

其實這三個觀念都環繞著一個特殊的資料型態 "id"

最根本的原因是objC裡, object type並不是在compiling type決定,而是在runtime決定

一個以id 宣告為type的物件, 它的type內容是可變的
例如


id mathobj;

Fraction *aFrac = [Fraction alloc] init];

Complex *bComp = [[Complex alloc] init];
mathobj = aFrac;
[mathobj print];
mathobj = bComp;
[mathobj print];

因為有繼承這個objC主要功能的關係, 很多物件都相互有同名的method, 當然內容可能各不一樣, 就可以用id這種型態, 動態呼叫不同的物件同名method

這部分又衍生一些檢查的功能
例如檢查這個class 的selector (method) 是否存在
selector是以SEL為type的物件
運用方法如下例

SEL action;
id graphicobject
...
action = @selector(draw)
...
[graphicobject performSelector: action];

也就是說selector可以動態選擇要執行的method


Try & Catch 例外處理

objC的exception 處理方式:
把有可能發生exception的程式段以
@try{
...
}
包起來

後面在撰寫處理程序
@catch(NSException exception){
...
}

@finally 是不管有沒有丟出exception都會執行的程式區

@throw可以自己丟出exception


2012年4月22日 星期日

Objective C 學習隨記(一)

最近因為Iphone4s 很熱, 開始對這Apple劃時代的產品產生興趣, apple跳脫舊科技公司產品的思維, 賣的不只是冰冷的硬體, 他還創造了一個ecosystem方便軟體工程師可以很方便的從開發環境到測試最後到線上銷售, 一條龍不需要太大的進入門檻, 這無疑讓軟體設計師可以不需要自組一個公司處理銷售服務, 完全只需要發揮創意! 想想台灣雖然身為科技島, 但是全都偏向代工, 對於創新的產業著墨不深, 當apple 和 google相繼開發出軟體開發平台, 這無疑的對台灣產業轉型, 提供一個最佳的機會, 畢竟創意才是科技的根本 

Ok 轉回主題, 不管是iphone還是ipad, 都是在apple公司開發的iOS上跑, 而iOS是從MacOSX 針對embedded device最佳化修改成的OS, 等同於Android是google基於linux 架構針對embedded device修改而成, 當然apple為了增加它應用程式(俗稱apps)的多樣性, 它徹底揚棄Microsoft對於開發人員設定的門檻, 這不得不說MS的失策, MS早在2000年初就進入smartphone的市場, 當時smartphone幾乎是MS獨佔, MS對每隻smartphone收的loyalty 超高, 加上MS對於Visual Studio收費真是高的嚇人, 所以會去開發它win ce apps的很少, 造成買了device卻沒甚麼apps可用的窘境, 一直到現在window mobile還在垂死掙扎, 就不多批評了.

不管iOS或Mac OSX應用程式都是用同一套開發工具,是免費的Xcode, 現在最新版本是4.0 , 使用的程式語言是objective C 這系列主要就是我讀一本書 "Programming in Objective-C" 4th edition的一些筆記 

objective-C 應該說是C的進化物件導向版本, 觀念非常像C++ class inherit 的觀念

 class宣告 

@interface Classname : NSobject //:NSObject 代表繼承於NSObject 
@property int a,b; //
@property代表 a跟b的 setter 和 getter由compiler自動產生, 要和implementation理加@synthesize a,b; 
-(return type) methodname:(type)para1:(type)para2;
@end 

class定義 

@implementation Classname
@synthesize a,b;
-(type) methodname: (type)para1:(type)para2 

 //statements 
}
 @end

 一般在實做class時要先allocate,再init 格式是
[[classname alloc] init] [classname alloc]會回傳一個class instance, 再呼叫class instance的init功能 也可以用 [classname new] 取代上述