3
類、對象、方法
在本章中,你講學習一些面向對象編程的技巧及如何在objective-c中編寫類。
什麼是對象
我們通過一個日常的例子來解釋它。我們假設您擁有一輛轎車,很顯然這輛車就是一個對象。現在你沒有任何一輛車,那麼你的車有可能在底特律、日本或者世界上任何一個地方的工廠裏製造中,是個抽象的。 而相應的你可能會去駕駛它,給它加油,洗車等等,這些都是針對於這個對象發生的動作。(這些,類,對象等含義與其他面向對象編程語言相同,因此定義方面也就不多說了)
現在通過實際例子來快速瞭解吧。下面假設你不瞭解類、方法等。你寫的程序可能是這個樣子的:
下面是面向對象方式的寫法。
在objective-c中,類的聲明分爲兩部分。
- 定義部分:以@interface開頭,@end結尾。定義了類中的成員,方法,方法的返回類型,參數等。
- 實現部分:類名同聲明時的類名相同,如下例中的 Fraction 。對於定義中的實現。
#import<Foundation/Foundation.h>
@interface Fraction:NSObject
{
int numerator;
int denominator;
}
-(void) print;
-(void) setNumerator:(int) n;
-(void) setDenomainator:(int) d;
@end
@implementation Fraction
-(void) print
{
NSLog(@"%i/%i",numerator,denominator);
}
-(void) setNumerator:(int) n
{
numerator=n;
}
-(void) setDenominator:(int) d
{
denominator=d;
}
@end
int main(int argc,char *argv[])
{
NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init]
Fraction *myFraction;
//創建一個實例
myFraction=[Fraction alloc];
myFraction=[myFraction init];
//給前面定義的變量賦值
[myFraction setNumerator:1];
[myFraction setDenominator:3];
//顯示輸出結果
NSLog(@"The value of myFraction is:");
[myFraction print];
[myFraction release];
[pool drain];
return 0;
}
我爲了熟悉這個定義調用等方法,自己照葫蘆畫瓢做了一個,調試的時候總是報錯:cannot init a class object 找了半天才發現,原來是創建實例的時候如下。
//創建一個實例
myFraction=[Fraction alloc];
myFraction=[myFraction init];
我誤將myFraction=[myFraction init]; 寫成 myFraction=[Fraction init]; 了 myFraction纔是實例,Fraction是類名,怪不得會報那個錯呢。呵呵,不過這樣對於objective-c中對於對象的初始化有了更深的印象,出點錯也未嘗不是件好事。
現在具體分析下類的定義,及相關使用方法。
首先,定義一個類需要,給它取一個名字(這與所有面向對象編程語言相同),然後在objective-c中,需要指定該類的父類,也就是繼承自哪個類。如下
@interface Fraction:NSObject
NSObject相當於c#中的object,是根類。
然後在大括號中間類成員,變量的定義。如下(返回值,跟變量名,同其他語言一樣,沒什麼好說的)
int numerator;
int denominator;
接着是方法的定義。如下共定義了三個方法:print、setNumerator、setDenomainator 其中 (void)前面的 - 號表示表示該方法是實例方法,相應的 + 表示類方法。 這裏是與我之前接觸的編程語言大不相同的地方。 (void)不用多說,大家應該相當熟悉表示方法的返回類型。接着是方法名稱如print、setNumerator等。
-(void) print;
-(void) setNumerator:(int) n;
-(void) setDenomainator:(int) d;
需要注意的是objective-c中參數的前面需要有冒號 : 並且多個參數的話需要有多個冒號。如:
-(void) exampleMetho:(int) weight zhongliang:(int) height
在weight後面的zhongliang是參數簽名用來標示參數作用的。
然後是實現部分@implementation 名稱需要與定義部分的名稱相同@implementation Fraction 。接着是實現之前所定義方法的具體代碼實現。
最後是main函數中,具體的調用過程。
NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init] 創建工程後 這一段系統會自動添加,具體原理等稍後的內存管理中會詳細解釋。
創建實例:Fraction *myFraction=[fraction allock] 等同於:
Fraction *myFraction;
myFraction=[Fraction alloc];
myFraction=[myFraction init];
釋放內存:[myFraction release]; 這個是與其他自動垃圾回收不同的地方。