在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指的是父類別名稱。
沒有留言:
張貼留言