Objective-C的initialize(静态方法)被多次调用?

7

我在Objective-C中有类似于以下代码:

SubclassOfNSObject *GlobalVariableThatShouldNeverChange;

@implementation MyClass

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

@end

我在代码中多次引用了这个变量,并且这个指针在我的代码中到处都使用,因此它不应该改变。但问题是,当我使用GHUnit运行测试时,GlobalVariableThatShouldNeverChange的指针会被更改(即被重新初始化)。我曾经遇到过变量通过autorelease pool释放的问题,已经解决了,我也有一个解决这个问题的方法,但我仍然想知道为什么会出现这种情况。谢谢!
3个回答

16

文档指出

运行时系统在每个程序中恰好向每个类发送一次 initialize 消息,正是在该类或者任何继承自它的类之前。

建议采用以下方法:

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

        /* put initialization code here */

    }
}

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

…在实现中,通常不应向super发送initialize


好的,我忘记了 self == Superclass,谢谢!那么你必须要有 [super initialize] 吗? - Richard J. Ross III
很有趣,我不知道这一点。这也意味着超类实际上可以在运行时找出它拥有哪些子类。 - fishinear

6

好的,我没有做任何重活,只是分配全局变量..谢谢,这教会了我很多! - Richard J. Ross III

2

补充dreamlax的回答:请注意,您可能会有子类而不必显式创建它们,即如果您使用KVO,则会动态创建一个子类(这将再次调用initialize),并且所有实例都将更改为此特定类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接