为什么UIViewController子类的Swift默认初始化器init()会初始化两次属性?UIView的子类也会出现同样的问题,但NSObject的直接子类则不会。
使用Parent(nibName: nil, bundle: nil)进行初始化可以解决该问题,而使用Parent()则不能。当我为Parent提供自定义初始化器时,它也能正常工作。
我知道如何解决这个问题,但我很好奇为什么这会发生。
将此代码复制到Xcode 6.0.1 Playground中即可重现此问题。
使用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的便利初始化方法(convenience init())是否应该以这种方式工作?
- UIViewController的便利初始化方法(convenience init())的实现中是否存在bug?
- 对于UIViewController来说,init()是一个有效的初始化器吗?也许不是,第一个示例中的
let parent = Parent()
甚至不应该编译通过?