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 才能正常瀏覽本網站,謝謝!

5.25.2011

Objective-C 中的類別方法與實體方法

類別方法與實體方法,簡單的來說就是函式前的加號 " + " 與減號 " - ",加號代表的是類別方法,而減號則是實體方法,類別方法是一種公開的方法,不需要事先宣告就可以直接使用它,而實體方法則是要先宣告此物件之後才可以使用的方法,而這兩者之間在撰寫上到底有什麼不同,請看以下程式碼。

假設我們有一個 Furnace 物件(SucClass),它的作用是設定並印出一段字串 "Furnace iOS 中文學習網站",並使用類別與實體方法來分別撰寫,其宣告與實做如下。

Furnace.h
#import <Foundation/Foundation.h>

@interface Furnace : NSObject {
    NSString *string;
}
@property (nonatomic, retain) NSString *string;

//實體方法
- (void)setString;
- (void)printString;

//類別方法
+ (void)setAndPrintString;
@end


Furnace.m
#import "Furnace.h"

@implementation Furnace
@synthesize string;

- (void)setString {
    string = @"Furnace iOS 中文學習網站";
}

- (void)printString {
    [self setString];
    NSLog(@"%@", string);
}

+ (void)setAndPrintString {
    NSLog(@"Furnace iOS 中文學習網站");
}
@end

在該物件中,可以明顯看出類別方法與實體方法的差異,類別方法不能去呼叫任何的實體方法來執行,也不能動用到該物件內的任何參數,否則編譯時就會出現錯誤,其原因在於使用類別方法並不需要特別花費記憶體來存放該物件,有點像是借用一下此物件的函式,自然也不需要知道該物件的內部參數有些什麼,在使用上兩者也有差別,請看以下程式碼。

不管是使用類別方法還是實體方法,在使用該物件時都必須先 #import 它。

#import "Furnace.h"
類別方法的使用方式非常簡單,直接點明要使用的函式即可。

[Furnace setAndPrintString];
如果使用上述程式碼的方式呼叫函式是看不到該物件內所宣告的實體方法,相對的想使用該物件內的實體方法就沒有這麼輕鬆,必須要先宣告並分配記憶體位置才可以使用。

Furnace *myFurnace = [[Furnace alloc] init];
[myFurnace printString];
[myFurnace release];

最後,在使用完 myFrunace 物件之後也請記得要回收(釋放)它所佔用的記憶體,回收記憶體的方式有很多,這裡就不多做討論。

ps:如果您是參考本範裡練習,編譯時可能會出現警告,其原因是沒有在範例中替此 Furnace 物件寫上建構式,若想避免此情形可以參考 Class 類別初始化的寫法(建構式)一文。






沒有留言:

張貼留言