2011年2月16日 星期三

Objective-C的類別初始化

在Java中,要對class variable作初始化,可以透過static method或是static block;而在Objective-C則是必須透過initialize

在Objective-C中,物件的預設建構式為init,是用來對類別的單一物件作初始化。而除了這個method,其實還有另一個預設的初始化method,叫做"initialize"。這是一個static method,所以是針對class variable來做初始化的。

但是有幾點跟Java比較不同的:
  • Java的類別初始化,若是透過static method,則必須做明確的呼叫;但是Objective-C的initialize,則是會在該類別第一次載入時被自動呼叫(跟Java的static block較類似)。
  • Java的static block僅會被執行一次;Objective-C的initialize則是在父類別與子類別被載入時,會分別個執行一次。(若是實際上只有子類別被使用,則實際的載入動作會先載入父類別並執行initialize,然後再載入子類別與執行initialize
因此,在使用initialize應該特別注意是否會被子類別進行重複呼叫。解決方法是在initialize執行時,檢查當時的類別是否為父類別或是特定類別,範例程式如下:
+ (void)initialize {
if(self == [XXXX class]) {
// initialize class variables here
}
}
其中,XXXX指的是父類別名稱。

沒有留言: