Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在目标C中,为什么在类+中使用'self==[className self]`;初始化?_Objective C - Fatal编程技术网

Objective c 在目标C中,为什么在类+中使用'self==[className self]`;初始化?

Objective c 在目标C中,为什么在类+中使用'self==[className self]`;初始化?,objective-c,Objective C,我在一个例子中看到了这一点——在类初始化中,这一行有什么用途吗 +(void)initialize { if (self == [ToolController self]) { ... } } 我已经读到,在类方法中,self指的是类而不是对象。那么从理论上讲,这个检查结果不总是正确的吗 在我看来,这条线将解决以下问题: ToolController==ToolController 所以这就是为什么我会认为它总是会产生真实的结果。我遗漏了什么吗?我认为您遗漏了se

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

+(void)initialize
{
   if (self == [ToolController self])
   {
      ...
   }
}
我已经读到,在类方法中,self指的是类而不是对象。那么从理论上讲,这个检查结果不总是正确的吗

在我看来,这条线将解决以下问题:
ToolController==ToolController


所以这就是为什么我会认为它总是会产生真实的结果。我遗漏了什么吗?

我认为您遗漏了
self
是ToolController的子类的可能性


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

来自
NSObject
上的Apple文档关于
初始化

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


因为您不能假设每个子类都会覆盖
initialize
方法(实际上,很可能不会),最好的做法是检查该类是否是您期望的类。

如果存在
ToolController
的子类,会发生什么情况?我非常确定初始化的文档中给出了原因。“重复”问题不是重复问题。这是一个稍微相关的问题,恰好有相同的答案。重复的问题实际上应该问相同的问题,而不仅仅是有相似的答案。这里有一个更好的重复:在中进行了更详细的解释。啊,这是有道理的,我没有意识到子类也在调用它。大多数情况下,我很难在谷歌上查询
self==[className self]
。干杯:)
+ (void)initialize {
  if (self == [ClassName self]) {
    // ... do the initialization ...
  }
}