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

Ben*_*ous 3 objective-c winobjc

在Microsoft的WinObjC UIApplication.mm文件(https://github.com/Microsoft/WinObjC/blob/master/Frameworks/UIKit/UIApplication.mm)中,该init方法适用于UIApplicationWOCDisplayMode.

类的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;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这可能会产生一些问题; 例如,如果其中某个超UIApplication一样UIResponder,在某些时候推翻init自己,并建立未来的方法调用依赖于内部状态.

为什么执行者选择不打电话[super init]?这是否是一个合理的决定?这是正确的吗?

Ste*_*ord 5

这绝对是代表这些类的作者的错误.

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

由于它们的UIApplication继承执行UIResponder,并且WOCDisplayMode继承自NSObject它们应该[super init]在这些类中调用.

根据对象初始化的文档:

调用超类的初始值设定项作为第一个操作的要求非常重要.回想一下,对象不仅封装了由其类定义的实例变量,还封装了由其所有祖先类定义的实例变量.通过调用super first的初始化程序,可以帮助确保首先初始化继承链上的类定义的实例变量.直接超类在其初始化程序中调用其超类的初始化程序,该超类程序调用其超类的主init ...方法,依此类推(见图6-1).正确的初始化顺序至关重要,因为后面的子类初始化可能依赖于超类定义的实例变量被初始化为合理的值.

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