在 init 方法中调用 [super init] 是否正确?
Is not calling [super init] in the init method ever correct?
在 Microsoft 的 WinObjC UIApplication.mm 文件中(在 https://github.com/Microsoft/WinObjC/blob/master/Frameworks/UIKit/UIApplication.mm),init
方法是为 UIApplication
和 WOCDisplayMode
实现的。
class'init
方法都不会调用 [super init]
,或者该系列方法中最终会导致调用 [super init]
的任何方法。除了 NSProxy
对象的初始化之外,我以前从未见过这个。
我在下面复制了 WOCDisplayMode
的实现以供参考。
-(instancetype) init
{
_fixedWidth = 320.0f;
_fixedHeight = 480.0f;
_fixedAspectRatio = 0.0f;
_magnification = 1.0f;
_autoMagnification = TRUE;
_sizeUIWindowToFit = TRUE;
_operationMode = WOCOperationModePhone;
return self;
}
在我看来,这可能会产生许多问题;例如,如果 UIApplication
的超 class 之一,如 UIResponder
,在某些时候覆盖 init
本身,并设置未来方法调用所依赖的内部状态.
为什么实施者选择不调用 [super init]
?这是一个合理的决定吗?它永远是正确的吗?
代表 类 的作者,这绝对是一个错误。
NSProxy
不调用 [super init]
因为它是一个抽象超类并且 不 继承自 NSObject
.
由于 UIApplication
的实现继承自 UIResponder
,而 WOCDisplayMode
继承自 NSObject
,因此他们应该在这些 [=32= 中调用 [super init]
].
根据 Object Initialization 上的文档:
The requirement to invoke the superclass’s initializer as the first
action is important. Recall that an object encapsulates not only the
instance variables defined by its class but the instance variables
defined by all of its ancestor classes. By invoking the initializer of
super first, you help to ensure that the instance variables defined by
classes up the inheritance chain are initialized first. The immediate
superclass, in its initializer, invokes the initializer of its
superclass, which invokes the main init... method of its superclass,
and so on (see Figure 6-1). The proper order of initialization is
critical because the later initializations of subclasses may depend on
superclass-defined instance variables being initialized to reasonable
values.
我建议将其记录为项目中的一个问题。
在 Microsoft 的 WinObjC UIApplication.mm 文件中(在 https://github.com/Microsoft/WinObjC/blob/master/Frameworks/UIKit/UIApplication.mm),init
方法是为 UIApplication
和 WOCDisplayMode
实现的。
class'init
方法都不会调用 [super init]
,或者该系列方法中最终会导致调用 [super init]
的任何方法。除了 NSProxy
对象的初始化之外,我以前从未见过这个。
我在下面复制了 WOCDisplayMode
的实现以供参考。
-(instancetype) init
{
_fixedWidth = 320.0f;
_fixedHeight = 480.0f;
_fixedAspectRatio = 0.0f;
_magnification = 1.0f;
_autoMagnification = TRUE;
_sizeUIWindowToFit = TRUE;
_operationMode = WOCOperationModePhone;
return self;
}
在我看来,这可能会产生许多问题;例如,如果 UIApplication
的超 class 之一,如 UIResponder
,在某些时候覆盖 init
本身,并设置未来方法调用所依赖的内部状态.
为什么实施者选择不调用 [super init]
?这是一个合理的决定吗?它永远是正确的吗?
代表 类 的作者,这绝对是一个错误。
NSProxy
不调用 [super init]
因为它是一个抽象超类并且 不 继承自 NSObject
.
由于 UIApplication
的实现继承自 UIResponder
,而 WOCDisplayMode
继承自 NSObject
,因此他们应该在这些 [=32= 中调用 [super init]
].
根据 Object Initialization 上的文档:
The requirement to invoke the superclass’s initializer as the first action is important. Recall that an object encapsulates not only the instance variables defined by its class but the instance variables defined by all of its ancestor classes. By invoking the initializer of super first, you help to ensure that the instance variables defined by classes up the inheritance chain are initialized first. The immediate superclass, in its initializer, invokes the initializer of its superclass, which invokes the main init... method of its superclass, and so on (see Figure 6-1). The proper order of initialization is critical because the later initializations of subclasses may depend on superclass-defined instance variables being initialized to reasonable values.
我建议将其记录为项目中的一个问题。