3

在 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;
}

在我看来,这可能会产生许多问题;例如,如果UIApplication, like的超类之一UIResponder在某个时候覆盖了init自身,并设置了未来方法调用所依赖的内部状态。

为什么实施者可能选择不调用[super init]?这是一个合理的决定吗?它曾经是正确的吗?

4

1 回答 1

5

代表这些课程的作者,这绝对是一个错误。

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

由于他们实现UIApplication继承自UIResponder,并WOCDisplayMode继承自NSObject他们应该[super init]在这些类中调用。

根据有关对象初始化的文档:

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

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

于 2015-08-07T07:00:27.490 回答