【问题标题】:In Objective C, why use `self == [className self]` in a class +initialize? [duplicate]在 Objective C 中,为什么在类 +initialize 中使用`self == [className self]`? [复制]
【发布时间】:2015-06-02 21:21:24
【问题描述】:

我在一个例子中看到过——在一个类初始化中,这行有什么用吗?

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

我读过在类方法中,self 指的是类而不是对象。那么理论上,这个检查不会总是结果为真吗?

在我看来,该行将解决此问题: ToolController == ToolController

所以这就是为什么我认为它总是会导致 true。我错过了什么吗?

【问题讨论】:

  • 如果有ToolController的子类会怎样?
  • 我很确定在初始化文档中给出了原因。
  • “重复”问题不是重复问题。这是一个稍微相关的问题,恰好有相同的答案。重复的问题实际上应该问同一个问题,而不仅仅是有相似的答案。
  • 这是一个更好的副本:stackoverflow.com/questions/324666/…

标签: objective-c


【解决方案1】:

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

大概在您正在阅读的示例中,+[ToolController initialize] 中发生的任何事情都应该仅在超类 (ToolController) 初始化时发生,而不是在ToolController 的任何子类时发生另外初始化。

【讨论】:

  • the documentation for +[NSObject initialize]中有更详细的解释。
  • 嗯,有道理,没有意识到子类也在调用它。大多数情况下,我很难为self == [className self] 形成一个谷歌查询。干杯:)
【解决方案2】:

来自NSObject 上关于initialize 的Apple Docs:

如果子类没有实现 initialize(运行时将调用继承的实现)或子类显式调用 [super initialize],则可能会多次调用超类实现。如果您想保护自己免于被多次运行,您可以按照以下方式构建您的实现:

+ (void)initialize {
  if (self == [ClassName self]) {
    // ... do the initialization ...
  }
}

由于您不能假设 每个 子类都会覆盖 initialize 方法(实际上,大多数 可能不会),因此最好检查一下该课程实际上是您所期望的。

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 2014-05-10
    • 2015-09-22
    • 1970-01-01
    • 2021-11-16
    • 2013-12-30
    • 2020-03-13
    • 2012-03-14
    相关资源
    最近更新 更多