首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在init方法中调用[超级init]不正确吗?

在init方法中调用[超级init]不正确吗?
EN

Stack Overflow用户
提问于 2015-08-07 06:52:16
回答 1查看 435关注 0票数 3

在微软的WinObjC UIApplication.mm文件(at https://github.com/Microsoft/WinObjC/blob/master/Frameworks/UIKit/UIApplication.mm)中,init方法是为UIApplicationWOCDisplayMode实现的。

类的init方法既不调用[super init],也不调用最终会导致调用[super init]的方法家族中的任何方法。除了NSProxy对象的初始化之外,我以前从未见过这种情况。

下面我已经复制了WOCDisplayMode的实现,以供参考。

代码语言:javascript
复制
-(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]?这是一个合理的决定吗?它曾经是正确的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-07 07:00:27

这显然是代表这些类的作者的错误。

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

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

根据Object Initialization上的文档

作为第一个操作调用超类的初始化程序的要求是很重要的。回想一下,一个对象不仅封装了它的类定义的实例变量,还封装了它的所有祖先类定义的实例变量。通过调用super的初始化器,可以帮助确保继承链上的类定义的实例变量首先被初始化。立即超类在其初始化项中调用其超类的初始化程序,该类调用主init.方法的超类,等等(参见图6-1)。正确的初始化顺序至关重要,因为子类的后期初始化可能取决于超类定义的实例变量被初始化为合理的值。

我建议把它作为项目的一个问题来记录。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31871381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档