7

我在Objective-C的類似下面的代碼:Objective-C的初始化(靜態方法)更多一次調用?

SubclassOfNSObject *GlobalVariableThatShouldNeverChange; 

@implementation MyClass 

+(void) initialize 
{ 
    [super initialize]; 
    GlobalVariableThatShouldNeverChange = [[SubclassOfNSObject alloc] init]; 
    // Change more stuff with GlobalVariableThatShouldNeverChange 
} 

@end 

我有這個整個代碼中引用,因爲我使用它無處不在,通過我的代碼指針,這應該不會改變。 問題是,當我使用GHUnit運行我的測試時,我遇到了奇怪的問題,GlobalVariableThatShouldNeverChange的指針被改變了(例如,它正在重新初始化。我遇到了通過autorelease池釋放的變量問題, ,我有這個問題的解決辦法,但我想知道爲什麼

謝謝

回答

16

docs說:?!

運行時發送在課程開始前,一次性地向程序中的每個類別初始化或任何繼承它的類

推薦的方法是:

+ (void)initialize 
{ 
    if (self == [GHUnit class]) { 

     /* put initialization code here */ 

    } 
} 

還要注意從文檔以下建議:

…您在執行過程中通常不應發送initializesuper

+0

好的,我忘了'self == Superclass',謝謝!你必須有'[超初始化]'嗎? – 2010-10-11 21:57:31

+0

這很有趣,我不知道。這也意味着一個超類可以在運行時真正發現它有哪些子類。 – fishinear 2012-10-18 15:51:08

6

簡短回答是肯定的,+initialize可以多次調用。

Bill Bumgarner在他的博客上寫了一篇關於此的好文章。請參閱+initialize Can Be Executed Multiple Times (+load not so much)

+0

好的..我沒有做任何繁重的工作,只分配了全局變量..感謝你,它教會了我很多! – 2010-10-11 22:01:48

2

要加上dreamlax的答案:要小心您可能沒有明確創建它們的子類,也就是說,如果您使用的是KVO,則會在運行中創建一個子類(這又將調用初始化),並且你的所有實例都將被改爲這個類。