为什么这些NSView swift子权限允许初始化运行两次

时间:2019-02-01 12:39:27

标签: swift nsview

在夫特下面,亚类时ChildView(dummy: NSObject())被调用时,用于ParentView两个不同的指定的初始值将被调用,和myLayer的{​​{1}}进行两次初始化的ivar

不,这将不会在一个游乐场发生 - 将正确报告ParentView

但是,在Xcode项目(例如命令行工具)中,它将可以编译并正常运行。

我了解很多情况,以及如何预防此问题。但是我很想了解为什么编译器不会出错,或者至少警告我有关此代码(并防止出现双重初始化)

这段代码可以在Swift 4.2下干净地编译,并且在调试器中,我可以确切地看到正在发生的事情:

调用error: MyPlayground.playground:5:31: error: must call a designated initializer of the superclass 'NSView'时,它将调用ChildView(dummy:)

这是一个指定的初始化程序,ParentView ivars是否也被初始化(ParentView(dummy:)

然后myLayer {呼叫{1}},它是ParentView(dummy:)

NSView.init()的实现调用super.init(),所以NSView.init()被调用,并调用initWithFrame。这也是指定的初始化程序,所以 ChildView.init(frame:)第二次初始化。

要演示这一点,请参见以下类,调用

ParentView.init(frame:)

myLayer将得到印刷两次。

避免这种情况的方法是调用let _ = ChildView(dummy: NSObject)呼叫>>>> creating layer,然后问题就消失了。

我的问题确实是,这怎么会首先发生?

ParentView(dummy:)

应该会生成一个编译时错误,就像在Playground中一样。

我似乎无法构造出具有相同行为的类似非NSView类层次结构。无论我如何调整的层次结构,构造函数等,斯威夫特,当我尝试这个新的对象(甚至当我混Objective-C和斯威夫特,是analagous到的NSView总是给人编译器错误。

尽管我可以看到它在调试器中执行,但是我也找不到NSView.init()的任何公共声明。

0 个答案:

没有答案