天天看點

[學習筆記—Objective-C]《Objective-C 程式設計 第6版》第七章 類

本章的學習筆記以本書第六章的例題(兩個分數的加法)為主線展開,逐漸介紹重要的知識點。

Part 1. 合成存取方法

從Objective-C 2.0 開始,可自動生成設定方法和取值方法:通過屬性。

接口檔案:

@interface Fraction : NSObject

@property int numerator, denominator; //分子,分母
           

實作檔案:

@implementation Fraction

@synthesize numerator, denominator;//告訴編譯器生成一對設定方法和取值方法。
           
  • 通過

    @property

    指令,就不需要在實作部分生成相應的執行個體變量。
  • 如果有稱為

    x

    的屬性,那麼在實作部分會導緻編譯器自動生成一個設值方法

    setX

    和取值方法

    x

Part 2. 使用點運算符通路屬性

設值方法

[myFraction setNumerator: ];
 [myFraction setDenominator: ]; 

//等價于

  myFraction.numerator = ; 
  myFraction.denominator = ;
           

Part 3. 局部變量

将一個分數約分的方法:

-(void) reduce    
{
    int u = numerator;
    int v = denominator;
    int temp;    
    //u,v,temp 局部變量

    while (v!=)
    {
        temp = u % v;
        u = v;
        v = temp;
    }

    numerator /= u;
    denominator /= u;
}
           
  • 其他方法無法通路reduce方法的局部變量
  • 預設初始化為nil,當方法傳回的時候,變量的值都消失了;執行個體變量在多次方法調用時保持自己的值

Part 4. self 關鍵字

self關鍵字的用途:在方法内直接指明消息的接受者(是對象)。

-(void) add: (Fraction *) f 
{
    numerator = numerator * f.denominator + denominator * f.numerator;
    denominator = denominator * f.denominator;

    [self reduce]; //進行約分。 self 作為aFraction的引用,分數得到約簡。(main函數中,計算對象 aFraction 和 bFraction的和,将結果直接約分)

}
           

Part 5. 将對象作為參數

  • 方法聲明:
//add:方法的參數是Fracion類對象的一個引用。當傳遞一個對象作為參數時,實際上是傳遞了一個資料存儲位置的引用。

-(void) add: (Fraction *) f; //将分數與分數相加
           
  • 方法展開:
-(void) add: (Fraction *) f   
{   
    numerator = numerator * f.denominator + denominator * f.numerator;
    denominator = denominator * f.denominator;
}
           
不能用這種方法直接指定參數f的執行個體變量。而是通過名字f辨別這個對象,然後通過對f應用點運算符來獲得執行個體變量。

Part 6. 将對象作為方法的傳回值

在方法中建立新的分數(對象)來存儲相加的結果并向消息的發送者傳回新的Fraction

//傳回一個對象。參數是對象。
-(Fraction *) add: (Fraction *) f 
{
    //建立新的對象存儲相加後的結果
    Fraction *result = [[Fraction alloc] init];

    //對象result裡面自動生成了numerator 和 denominator
    result.numerator =numerator * f.denominator + denominator * f.numerator;
    result.denominator = denominator * f.denominator;

    [result reduce]; //對相加的結果約分  

    return result;   //傳回值
}