在Objective C中,为什么在类+ initialize中使用`self == [className self]`?

时间:2015-06-02 21:21:25

标签: objective-c

我在一个例子中看过这个 - 在一个类初始化中,这行是否有任何用途?

+(void)initialize
{
   if (self == [ToolController self])
   {
      ...
   }
}

我已经读过,在类方法中,self指的是类而不是对象。所以从理论上讲,这种检查总是会导致真的吗?

在我看来,这一行会解决这个问题: ToolController == ToolController

这就是为什么我认为它总会导致真实的原因。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

我认为您错过了self是ToolController的子类的可能性。

大概在你正在阅读的例子中,+[ToolController initialize]中发生的任何事情只有在超类(ToolController)初始化时才会发生,而在任何子类时都不会发生 ToolController初始化。

答案 1 :(得分:2)

关于NSObject的{​​{1}}上的Apple文档:

  

如果子类没有实现初始化,则可以多次调用超类实现 - 运行时将调用继承的实现 - 或者如果子类显式调用[super initialize]。如果您想保护自己不被多次运行,您可以按照这些方式构建您的实现:

initialize

您可以假设每个子类都会覆盖+ (void)initialize { if (self == [ClassName self]) { // ... do the initialization ... } } 方法(事实上,大多数可能会赢得' t),检查课程实际上是您期望的课程是最佳做法。