Objective-C初始化(静态方法)被称为更多一次?

时间:2010-10-11 21:46:25

标签: objective-c unit-testing initialization global-variables autorelease

我在Objective-C中有类似的代码:

SubclassOfNSObject *GlobalVariableThatShouldNeverChange;

@implementation MyClass

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

@end

我在整个代码中引用了这个,并且指向它的指针永远不会改变,因为我在我的代码中到处使用它。 问题是,当我使用GHUnit运行测试时,我发现GlobalVariableThatShouldNeverChange指针被更改的奇怪问题(即它正在重新初始化。我有一个问题,即通过自动释放池已修复,我有解决此问题的方法,但我想知道 为什么

谢谢!

3 个答案:

答案 0 :(得分:16)

docs说:

  

运行时将初始化发送到程序中的每个类,恰好在类或从其继承的任何类之前一次。

推荐的方法是:

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

        /* put initialization code here */

    }
}

另请注意文档中的以下建议:

  

...您通常不应在实施中向initialize发送super

答案 1 :(得分:6)

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

Bill Bumgarner在他的博客上写了一篇关于此事的好文章。见+initialize Can Be Executed Multiple Times (+load not so much)

答案 2 :(得分:2)

要加上对dreamlax的回答:请注意你可能没有明确创建它们的子类,即如果你正在使用KVO,则会动态创建一个子类(这又会再次调用initialize),并且你的所有实例都被改为这门课。