iphone學習筆記(三)

3

類、對象、方法

在本章中,你講學習一些面向對象編程的技巧及如何在objective-c中編寫類。

什麼是對象

我們通過一個日常的例子來解釋它。我們假設您擁有一輛轎車,很顯然這輛車就是一個對象。現在你沒有任何一輛車,那麼你的車有可能在底特律、日本或者世界上任何一個地方的工廠裏製造中,是個抽象的。 而相應的你可能會去駕駛它,給它加油,洗車等等,這些都是針對於這個對象發生的動作。(這些,類,對象等含義與其他面向對象編程語言相同,因此定義方面也就不多說了)

現在通過實際例子來快速瞭解吧。下面假設你不瞭解類、方法等。你寫的程序可能是這個樣子的:

下面是面向對象方式的寫法。

在objective-c中,類的聲明分爲兩部分。

  1. 定義部分:以@interface開頭,@end結尾。定義了類中的成員,方法,方法的返回類型,參數等。
  2. 實現部分:類名同聲明時的類名相同,如下例中的 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]; 這個是與其他自動垃圾回收不同的地方。

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章