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