我应该拨打super in + initialize吗?

时间:2012-07-19 07:07:53

标签: iphone objective-c ipad

我是否需要这样做:

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

有关详细信息,请参阅this blog post by Mike Ash

答案 1 :(得分:0)

  

运行时发送初始化到之前程序中的每个类   该类或从其继承的任何类都是第一个发送的   来自程序内的消息。运行时发送初始化   以线程安全的方式向类发送消息。超级课程会收到这个   他们的子类之前的消息。超类的实现可能是   如果子类没有实现initialize-the,则多次调用   运行时将调用继承的实现 - 或者是子类   显式调用[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];

    ...
}

有效。