爲什麼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