我在Objective-C中有类似的代码:
SubclassOfNSObject *GlobalVariableThatShouldNeverChange;
@implementation MyClass
+(void) initialize
{
[super initialize];
GlobalVariableThatShouldNeverChange = [[SubclassOfNSObject alloc] init];
// Change more stuff with GlobalVariableThatShouldNeverChange
}
@end
我在整个代码中引用了这个,并且指向它的指针永远不会改变,因为我在我的代码中到处使用它。
问题是,当我使用GHUnit
运行测试时,我发现GlobalVariableThatShouldNeverChange
指针被更改的奇怪问题(即它正在重新初始化。我有一个问题,即通过自动释放池已修复,我有解决此问题的方法,但我想知道 为什么 ?
谢谢!
答案 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),并且你的所有实例都被改为这门课。