7

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

SubclassOfNSObject *GlobalVariableThatShouldNeverChange;

@implementation MyClass

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

@end

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

谢谢!

4

3 回答 3

16

文档说:

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

推荐的方法是:

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

        /* put initialization code here */

    }
}

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

…您通常不应该在您的实施中发送initialize到。super

于 2010-10-11T21:55:57.667 回答
6

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

Bill Bumgarner 在他的博客上写了一篇关于这个的好文章。见+initialize 可以执行多次(+load 没那么多)

于 2010-10-11T21:56:48.450 回答
2

加上dreamlax的回答:请注意,您可能有子类而没有显式创建它们,即如果您使用的是KVO,则会即时创建一个子类(这反过来又会再次调用initialize),并且您的所有实例正在更改为这个类。

于 2012-01-18T16:14:40.763 回答