8

我需要这样做吗:

+(void)initialize{
     ...my stuff...
  [super initialize];
 }

也就是说,如果我在我的 App Delegate 中initialize从父类 ( NSObject) 覆盖,我需要确保超级实现也被调用?或者这不适用,因为这不是实例方法?

这种方法有多“安全”?我正在实现 iNotify 库,文档建议将设置添加到此方法,但我以前没有将它用于应用程序中的任何内容,并且还想知道它是否可能与其他意外冲突?

4

2 回答 2

7

如果您有此类的子类,则最好使用 dispatch_once 语句调用您的代码,因为每个子类将再次调用此方法

+(void)initialize
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
    {
        //Your Code
    });
}

有关详细信息,请参阅Mike Ash的这篇博文。

于 2012-07-19T07:27:41.390 回答
0

运行时向程序中的每个类发送初始化,就在类或从它继承的任何类从程序内发送其第一条消息之前。运行时以线程安全的方式将初始化消息发送到类。超类在其子类之前收到此消息。如果子类没有实现 initialize(运行时将调用继承的实现)或子类显式调用 [super initialize],则超类实现可能会被多次调用。如果您想保护自己免于被多次运行,您可以按照以下方式构建您的实现:

https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/nsobject_class/reference/reference.html#//apple_ref/occ/clm/NSObject/initialize

从而使两者

+ (void)initialize
{
    ...
}

+ (void)initialize
{
    [super initialize];

    ...
}

有效的。

于 2014-05-26T14:05:28.667 回答