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 ...
}
}