en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

2.18.2011

Class 類別初始化的寫法(建構式)

在開始之前必須要有一個模擬情境來建立我們的物件,例如寫一個可以存放學生身高體重的物件(Student Class),並且日後希望在建立這個物件時就可以同時設定這兩項數值,下面就先來看一下這個物件大致上的結構。

Student.h


#import <Foundation/Foundation.h>

@interface Student : NSObject {

    //宣告兩個整數參數用來紀錄身高體重
    int height;
    int weight;
}

@property int height, weight;
@end

使用 @property 自動產生 setter 與 getter 方法,用來改變與取得身高體重兩個變數。

Student.m


#import "Student.h"

@implementation Student
@synthesize height, weight;

@end

在實作中使用 @synthesize 可以自動實作 @property 自動產生的 setter 與 getter 方法,關於 setter 與 getter 方法,請參考變數的 Setter 與 Getter 一文。

程式碼到這裡還沒有位寫入對此類別進行初始化的方法,勉強只能使用 alloc 來分配記憶體位置,之後在分別給予兩個參數不同的值,這樣很麻煩、效率也很低。所以下面我們將新增一個函式來初始化 Student 這個物件。

Student.h


#import <Foundation/Foundation.h>

@interface Student : NSObject {

    //宣告兩個整數參數用來紀錄身高體重
    int height;
    int weight;
}

@property int height, weight;
- (Student *)initWithHeight:(int)h andWeight:(int)w;
@end

在這裡我們遵循 Objective-C 的命名方式,初始化以 init 開頭並使用 With 來表示在初始化時所要給予的參數值。

Student.m


#import "Student.h"

@implementation Student
@synthesize height, weight;

- (Student *)initWithHeight:(int)h andWeight:(int)w {
    self = [super init];

    if (self) {
        height = h;
        weight = w;
    }

    return self;
}
@end

上述程式碼演示了一個簡單的初始化過程,首先是建立與自己相同型態的實體(Student),之後式判斷實體是否存在(是否建立成功),如果是,就設定這兩個參數的數值,因為唯有實體建立成功才有辦法對這兩個參數進行設定,否則會出現 crash 的現象,最後傳再回一個 Student 型態的物件(實體)。

有了初始化的函式之後,在使用上也變得相當簡單,在引用 Student 的標頭檔之後就可以開始使用。

#import "Student.h"
在引用標頭檔時有一個原則,如果不是系統本身的標頭檔必須使用雙引號標記 " " ,反之則使用角括號標記 <  >。

下列程式碼則是使用上得範例,由於使用了指令 alloc 來分配記憶體位置,因此請記得在使用完該物件之後必須要釋放記憶體,避免造成 Memory Leak的窘境。

Student *studentA, *studentB;

studentA = [[Student alloc] initWithHeight:184 andWeight:75];
studentB = [[Student alloc] initWithHeight:165 andWeight:48];

[studentA release];
[studentB release];


 






沒有留言:

張貼留言