为什么UIViewController子类的Swift默认初始化程序init()
初始化属性两次?同样的事情发生在UIView的子类中,但与NSObject的直接子类不同。为什么UIViewController子类的Swift默认初始化程序初始化属性两次?
通过使用Parent(nibName: nil, bundle: nil)
而不是Parent()
进行初始化,问题消失。当我为Parent
提供自定义初始化程序时,它也能正常工作。
我知道如何解决这个问题,但我很好奇它为什么会发生。
该问题可通过将此代码复制到Xcode 6.0.1 Playground进行复制。
import UIKit
class Child {
init() {
println("Child init")
}
}
class Parent: UIViewController {
let child = Child()
}
// This way "Child init" is printed twice:
let parent = Parent()
// This way "Child init" is printed once:
//let parent = Parent(nibName: nil, bundle: nil)
更新:当我定义了具有相似初始化像那些UIViewController
拥有和使用,作为Parent
左右逢源超初始化它只是工作,并打印“孩子初始化”假类一旦。
import UIKit
class Child {
init() {
println("Child init")
}
}
class FakeViewController : UIResponder {
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
}
convenience override init() {
self.init(nibName: nil, bundle: nil)
}
}
class Parent: FakeViewController {
let child = Child()
}
// With the FakeViewController both initializers cause "Child init" to be printed once:
let parent = Parent()
//let parent = Parent(nibName: nil, bundle: nil)
- 是UIViewController的便利的init()应该工作的方式?
- 在UIViewController的便捷init()的实现中是否存在缺陷?
- 是init()UIViewController的有效初始值设定项吗?也许它不是和
let parent = Parent()
在第一个例子中甚至不应该编译?
请参阅UIViewController中的文档,以及在继承它时需要提供的内容。通过插入FakeViewController,您正在使用以下建议来解决问题。 – AlBlue 2014-09-28 15:43:24