是不是在init方法中调用[super init]是否正确?

时间:2015-08-07 06:52:17

标签: objective-c winobjc

在Microsoft的WinObjC UIApplication.mm文件(https://github.com/Microsoft/WinObjC/blob/master/Frameworks/UIKit/UIApplication.mm)中,initUIApplication都实现了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]?这是否是一个合理的决定?这是正确的吗?

1 个答案:

答案 0 :(得分:5)

这似乎代表这些类的作者的错误。

NSProxy不会调用[super init],因为它是一个抽象的超类,继承自NSObject

由于UIApplication的实施继承自UIResponder,而WOCDisplayMode继承自NSObject,因此他们应在这些类中调用[super init]

根据Object Initialization上的文件:

  

要求调用超类的初始化程序作为第一个   行动很重要。回想一下,一个对象不仅封装了   实例变量由其类定义,但实例变量   由它的所有祖先类定义。通过调用初始化器   超级首先,您可以帮助确保定义的实例变量   首先初始化继承链的类。眼前的   超类,在其初始化程序中,调用其初始化程序   超类,调用其超类的主init ...方法,   等等(见图6-1)。正确的初始化顺序是   因为后来的子类初始化可能依赖于   超类定义的实例变量被初始化为合理的   值。

我建议将其记录为项目中的问题。