2012-01-18 79 views
1

我有一个类Foo,它实现了一个+(void)initialize方法。我也有一个类是Foo的子类。当我实例化子类时,initialize方法也会在我不想要的Foo上调用。我如何防止这种情况?subclassing objective-c中的初始化方法

谢谢。

+0

我是否正确地认为你只是不在'init'子类中做'self = [super init]'? – petert 2012-01-18 16:48:36

+0

我想他是在谈论类'initialize'方法,但是如果他真的指的是'init',那么这是正确的。 – 2012-01-18 16:51:06

+0

+(void)初始化 – JPC 2012-01-18 16:51:35

回答

0

我已经解决了它的不执行初始化,只是调用设置方法,而不是

+0

Costique的答案更好,也是Apple推荐的方式。在多线程的情况下调用一次setup方法可能会非常困难,并且为此目的进行初始化。 – fishinear 2013-03-20 19:21:20

+0

Fishinear,bbum另有说明,通常是正确的(http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/) – 2014-04-08 19:17:07

1

您还需要在子类中实现+ (void)initialize。通常人们会拨打[super initialize],但您会想跳过这一步。一个空的方法将阻止Foo的被调用。

编辑总是调用超类initialize方法。它不能也不应该通过子类来阻止,因为技术上超类也被初始化并可以独立使用。

+0

我实现了在我的子类和超类中初始化。根据苹果文档,超类的初始化将始终在任何子类之前被调用。无论如何防止 – JPC 2012-01-18 16:51:25

+0

嗯。我测试了一下,看到了同样的结果。我想我正在改变我的答案。 Foo的'initialize'方法是做什么的,你必须防止? – 2012-01-18 17:20:52

+0

它分配一个对象,该对象侦听并执行通知的方式与其子类的方式不同。我已经通过不实现初始化并调用设置方法来解决它。 – JPC 2012-01-18 17:28:44

7

在您的方案(如果有涉及到子类),你应该检查类,以该initialize方法发送:

+ (void) initialize 
{ 
    if (self == [MyClass class]) 
    { 
     // Do something here only once 
    } 
}