Objective-C 入門學習 從O開始
Objective-C 入門學習 從O開始 是本文要介紹的內容,Objective-C的基本語法,傳統(tǒng)的面向對象語言的封裝,繼承以及多態(tài)在Objective-C上會是什么樣子。適合于熟悉面向對象編程的讀者。
Objective-C:加強版的C?
Objective-C是基于標準的ANSI C的一門面向對象語言。其語法和設計主要基于Smalltalk,所以有些類似,而且支持標準的C語言語法。代碼文件的類型有三種:[.h]頭文件,[.m]C代碼,[.mm]C++代碼。定義了一種新的調用頭文件的方法#import,這樣不會重復#include頭文件,只在沒有調用過的時候調用一次,類似于PHP的require_once。
最常用的數(shù)據類型:字符串NSString
Objective-C將字符串數(shù)據類型定義成為Class,支持可變長度的字符串,支持Unicode等等一些實用的方法。通過使用@標志符,可以方便的由字符串常量定義NSString對象。下面給出一些定義NSString的代碼實例。
- NSString *string1 = @"const string";
- NSString *string2 = [NSString stringWithFormat:@"%d %d %s", 1, 2, "hello string"];
類(Class)
作為面向對象語言最基本也是最重要的數(shù)據類型,Objective-C當然不會不支持。Objective-C定義類的特點在于先在.h頭文件里定義接口,然后在.m代碼文件里實現(xiàn)。
關于.h頭文件的具體的語法看下面的圖更直接一點。
關于.m代碼文件的具體語法也請參考下面的圖。
大家注意一下initWithUserName()方法的返回值的數(shù)據類型為id,是不是感覺這個一般的語言有點區(qū)別。其實,這種數(shù)據類型類似于C++的指針。在Objective-C里面仍然叫做指針類型。Objective-C的對象的定義,可以支持強類型的實例,以及弱類型的實例的定義。簡單的說,強類型就是定義該實例的時候必須指明類的名字,弱類型就是沒有指明類的名字。下面給大家看看實際的代碼就會明白,定義這兩者的時候的區(qū)別。
- MYHelloWorld *myHelloWorld1; // 強類型(Strong typing)
- id myHelloWorld2; // 弱類型(Weak typing)
順別提一下,弱類型能給實現(xiàn)設計模式(Design Patterns)的時候帶來很大的方便。
方法(Methods)
方法Methods又可稱為函數(shù)。在Objective-C里的類可以定義兩種方法。一種是實例的方法,一種是類的方法。實例的方法局限于某個類的實例,也就是必須定義這個類的實例之后,才能被調用執(zhí)行的方法。類的方法不需要創(chuàng)建實例,直接通過類的名稱就可以被調用執(zhí)行的方法。
定義一個方法需要:方法名(一個或者多個關鍵字),返回值類型,參數(shù)類型和參數(shù)名。下面這的圖詳細的說明了如何定義一個實例的方法,其中負號[-]表示該方法為實例的方法,該方法的名稱加上各個關鍵字包括冒號即為[insertValue:atIndex:]。
Objective-C調用方法是通過發(fā)送消息給對應的實例對象。發(fā)送消息的方式其實是和一般的編程語言一樣就是調用實例對象的方法,Objective-C獨特的地方就是方法的調用是通過一個方法名+零個或多個標示符+零個或多個參數(shù),然而一般的編程語言只需要一個方法名+零個或多個參數(shù)就可以了。
Objective-C里面之所以把調用方法稱為發(fā)送消息,大概是因為所有的消息發(fā)送之后都是動態(tài)傳遞給實例對象的。并且,如果一個子類定義了一個和父類相同方法名+標示符的方法之后,子類會先收到該消息,然后選擇性的是否繼續(xù)將該消息傳遞給父類。
發(fā)送消息是通過一對方括號[]來實現(xiàn)的。在括號的里面,實例對象在左邊,消息以及參數(shù)等的定義在右邊。例如:
- [anObject insertValue:anObj atIndex:1];
為了避免生成多余的臨時變量,Objecttive-C容許直接使用消息的結果。如下例:
- [[anObject getArray] insertValue:[anObject getValueToInsert] atIndex:0];
類的方法,類似于靜態(tài)方法(Static Function),常用于作為工廠模式中用來生成新的實例。定義的時候和實例的方法有區(qū)別的地方就是開頭的符號為加號[+]。調用的類的方法和調用(Static Function)基本相同,直接通過類名就可以,如下例:
- NSMutableArray* myArray = nil; // nil等同于通常的NULL
- // 創(chuàng)建一個動態(tài)數(shù)組,并且制定最初的大小
- myArray = [NSMutableArray arrayWithCapacity:19];
屬性
屬性是一個可以取代方法的方便符號。在類中聲明定義屬性時,并不創(chuàng)建新的實例,就是一個能夠方便快捷的用來訪問實際已經存在的變量的方法。也就是說,屬性其實并沒有真正的存儲任何數(shù)據。
其實屬性是可以讓你在編寫代碼時減少影響效率的冗余代碼。簡單的說屬性要比getter和setter方法快。
屬性還可以定義一些訪問該屬性時的限制或者如何獲取該屬性,例如指定copy用來復制該屬性,readonly用來指定該屬性只讀。
- @property BOOL workFlag;
- @property (copy) NSString* oString; // 通過復制來使用該屬性.
- @property (readonly) UIView* oView; // 定義一個類似于getter的屬性.
調用某實例的屬性有兩種方法,一種是通過括號,和調用方法類似,另外一種是通過點符號[.]。第二方法比較方便,也符合大多數(shù)開發(fā)人員的習慣。
- // 第一種調用方法
- [myObject setFlag:YES];
- CGRect viewFrame = [[myObject rootView] frame];
- // 第二種調用方法
- myObject.flag = YES;
- CGRect viewFrame = myObject.rootView.frame;
協(xié)議和委托(Protocols and Delegates)
Objective-C中的協(xié)議(Protocol)類似于常用的接口,協(xié)議(Protocols)中定義的方法,在類中實現(xiàn)。
- @protocol MyFirstProtocol
- - (void)myFirstProtocolMethod;
- @end
在iPhone OS中,協(xié)議(Protocol)通常用來實現(xiàn)委托對象(Delegate Object)。委托對象(Delegate Object)一般用來自己定義行為或者動作,也就是調用自己定義方法,但自己不實現(xiàn)該方法,委托其它的類來實現(xiàn)該方法。
UIApplication類就是一個典型的例子。UIApplication類中定義了一個應用程序應有的行為或者動作。而不是強制讓你的UIApplication子類去接受當前應用程序的狀態(tài)消息并做出相應處理。UIApplication類通過調用特殊的方法,來傳遞這些消息給它的委托對象。這個委托對象通過實現(xiàn)名為UIApplicationDelegate的協(xié)議(Protocol),之后就可以接受到當前應用程序的狀態(tài)消息并做出相應處理。比如內存不夠的錯誤,應用程序被中斷等重要消息。
下面給出一段關于HelloWorld的實例代碼:
- //main.m
- #import
- int main(int argc, char *argv[])
- {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- int retVal = UIApplicationMain(argc, argv, nil, nil);
- [pool release];
- return retVal;
- }
本文到這里就結束了,如果您有什么意見請在下面發(fā)表評論。本文只是針對有一定編程經驗的開發(fā)人員,簡單的介紹了Objective-C的主要特征。本站將會陸續(xù)推出各種iPhone開發(fā)的相關資訊,敬請大家關注。
小結:關于Objective-C 入門學習 從O開始的內容介紹完了,希望本文對你有所幫助!