【问题标题】:Objective-C initialize (static method) called more that once?Objective-C 初始化(静态方法)调用不止一次?
【发布时间】:2011-04-24 00:52:42
【问题描述】:

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

SubclassOfNSObject *GlobalVariableThatShouldNeverChange;

@implementation MyClass

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

@end

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    docs 说:

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

    推荐的方法是:

    + (void)initialize
    {
        if (self == [GHUnit class]) {
    
            /* put initialization code here */
    
        }
    }
    

    还要注意文档中的以下建议:

    ...在您的实现中,您通常不应将initialize 发送到super

    【讨论】:

    • 好的,我忘了self == Superclass,谢谢!你必须有[super initialize]吗?
    • 这很有趣,我不知道。这也意味着超类实际上可以在运行时找出它有哪些子类。
    【解决方案2】:

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

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

    【讨论】:

    • 好的..我没有做任何繁重的工作,只是分配全局变量..谢谢,它教会了我很多东西!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 2012-05-25
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      相关资源
      最近更新 更多