Learn Objective‐C
原文地址 http://cocoadevcentral.com/d/learn_objectivec/
譯者前言
在網上看到這篇文章覺得寫的很不錯,但是貌似沒有人翻譯成中文,我就大膽翻譯了。本人做軟體開發6年了,但是大多數是在Windows平台上,最近才在我的機器上裝了一個leopard,在Objective-C上也是一個新手,對於本文翻譯的是否到位心裡還在打鼓。如果有覺得翻譯不對不好的地方,請與我聯絡,我的油箱是:cchenhao at gmail dot com。
cc很好J,謝謝大家。
Objective-C
Objective‐C是開發Mac軟體的主要程式設計語言。如果你瞭解一些物件導向的基本概念和C語言,那麼會對你學習Objective‐C有很多協助,如果你不瞭解C,那麼建議你先讀一下C 指南。
這篇指南由Scott Stevenson編寫並做圖。
方法調用
為了儘快開始,讓我們先看一些例子。
調用一個對象的方法的基本文法是這樣的:
[object method];
[object methodWithInput:input];
方法可以有傳回值:
output = [object methodWithOutput];
output = [object methodWithInputAndOutput:input];
你還可以調用類的方法,這也是建立一個對象的辦法。在下面的例子裡,我們調用了NSSting類的string方法,用來返回一個新的NSString類的對象。
id myObject = [NSString string];
id類型意味著變數myObject可以是任意類型的對象。所以,當你編譯這段代碼時,它的實際類型以及它所實現的方法編譯器是不知道的。在我們的例子裡,很顯然對象的類型是NSString,所以我們可以改變對象的型別宣告:
NSString* myString = [NSString string];
現在,這就是一個NSString類型的變數了,如果我們在這個對象上調用NSString類型對象不支援的方法,編譯器就會發出警告。
注意:在物件類型的右面有一個星號(*),在Objective-C中,所有的物件變數都是指標類型。id類型已經被預定義為指標類型,所以不需要加一個星號。
嵌套調用
在許多程式設計語言中,嵌套的方法或函數調用像是這樣的:
function1(function2());
function2的傳回值做為輸入參數傳遞給function1。在Objective-C中,嵌套調用看上去像是這樣的:
[NSString stringWithFormat:[prefs format]];
要盡量避免在一行語句中進行兩層以上的嵌套,這樣會使代碼的可讀性降低。
多輸入參數的方法
一些方法需要多個輸入參數。在Objective-C中,一個方法的名字可以被拆分成幾段,在標頭檔中,多輸入參數的方法聲明看上去像是這樣的:
-(BOOL)writeToFile:(NSString *)path
atomically:(BOOL)useAuxiliaryFile;
你可以這樣調用這個方法:
BOOL result = [myData writeToFile:@”/tmp/log.txt” atomically:NO];
這些不是具名引數。在運行時環境中,該方法的名字實際上是 writeToFile:atomically:
訪問器
在Objective‐C中,所有的執行個體變數預設都是私人的,所以,在大多數情況下,你應該使用訪問器來擷取或設定這些變數的值。現在有兩種文法。下面的是傳統的1.x文法:
[photo setCation:@”Day at the Beach”];
output = [photo caption];
第2行代碼不是直接讀取執行個體變數。實際上它是在調用名為caption的方法。在Objective-C中,大多數情況你不用在擷取器(getter)前面添加一個”get”首碼。在任何情況下,在方括弧中代碼都意味著你是在給一個對象或者一個類型發送一個訊息(即一個方法調用)。
點操作符
在Mac OS X 10.5中,Objective-C 2.0新增了點操作符的設定器(setter)和擷取器(getter):
photo.caption = @”Day at the Beach”;
output = photo.caption;
兩種文法你可以使用任何一種,但是在一個項目中最好只使用一種。同時,點文法只能使用在設定器(setter)和擷取器(getter)上,而不能用於普通方法。
建立對象
建立對象有兩種主要的辦法。第一個是之前你看到的:
NSString* myString = [NSString string];
這是一種更加方便自然的方式。通過這種方法,你建立了一個自動釋放(autoreleased)的對象,這一點我們會在後面看到更多的細節。儘管如此,在許多地方,你可能需要通過手工建立的方式來建立一個對象,如下:
NSString* myString = [[NSString alloc] init];
這是一個嵌套的方法調用。第一個是NSString類本身的alloc方法調用。這是一個相對低層的調用,它的作用是分配記憶體及執行個體化一個對象。第二個是調用新建立對象的init方法。init方法通常做對象的初始化設定工作,比如建立執行個體變數。作為一個類的使用者,你無法知道這些方法的實現細節。在某些情況下,你可以使用init方法的另外一種版本,這些版本帶有輸入參數:
NSNumber* value = [[NSNumber alloc] initWithFloat:1.0];