在Microsoft的WinObjC UIApplication.mm文件(https://github.com/Microsoft/WinObjC/blob/master/Frameworks/UIKit/UIApplication.mm)中,init
和UIApplication
都实现了WOCDisplayMode
方法。
类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
的超类(如UIResponder
)在某个时候覆盖了init
本身,并设置了未来方法调用所依赖的内部状态。
为什么实施者可能选择不致电[super init]
?这是否是一个合理的决定?这是正确的吗?
答案 0 :(得分:5)
这似乎代表这些类的作者的错误。
NSProxy
不会调用[super init]
,因为它是一个抽象的超类,不继承自NSObject
。
由于UIApplication
的实施继承自UIResponder
,而WOCDisplayMode
继承自NSObject
,因此他们应在这些类中调用[super init]
。
根据Object Initialization上的文件:
要求调用超类的初始化程序作为第一个 行动很重要。回想一下,一个对象不仅封装了 实例变量由其类定义,但实例变量 由它的所有祖先类定义。通过调用初始化器 超级首先,您可以帮助确保定义的实例变量 首先初始化继承链的类。眼前的 超类,在其初始化程序中,调用其初始化程序 超类,调用其超类的主init ...方法, 等等(见图6-1)。正确的初始化顺序是 因为后来的子类初始化可能依赖于 超类定义的实例变量被初始化为合理的 值。
我建议将其记录为项目中的问题。