【发布时间】:2014-11-22 22:36:21
【问题描述】:
为什么 UIViewController 子类的 Swift 默认初始化器init() 会两次初始化属性? UIView 的子类也会发生同样的事情,但 NSObject 的直接子类不会。
使用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 的超类,两种方式都可以初始化它只打印一次“Child init”。
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() 的实现是否有bug?
- init() 是 UIViewController 的有效初始化程序吗?也许不是,第一个示例中的
let parent = Parent()甚至不应该编译?
【问题讨论】:
-
查看 UIViewController 中的文档,以及子类化时需要提供的内容。通过插入 FakeViewController,您可以使用以下建议来解决问题。
标签: ios swift initialization xcode6