gpt4 book ai didi

ios - 为什么 UIViewController 子类的 Swift 默认初始化程序会两次初始化属性?

转载 作者:搜寻专家 更新时间:2023-10-31 22:16:49 25 4
gpt4 key购买 nike

为什么 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 的父类(super class)以两种方式进行初始化它工作并只打印一次“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 的 convenience init() 的实现是否存在错误?
  • init() 是 UIViewController 的有效初始化程序吗?也许不是,第一个示例中的 let parent = Parent() 甚至不应该编译?

最佳答案

第一次打印发生在构造Parent实例时;所有实例字段都在此时初始化,包括创建 Child 实例。

第二次打印发生在调用父级的隐式 super.init 时。鉴于此代码已关闭,因此无法确定发生了什么;但问题可能源于 initUIViewcontroller 中的便利初始化程序(指定的初始化程序是 init:nibName:bundle)。 UIVIewController 中的文档指出,当它被覆盖时,必须调用所需的初始化程序。

因此,要更正此问题,您需要添加:

class Parent: UIViewController {
override init() {
super.init(nibName:nil,bundle:nil)
}
// the following is also required if implementing an initializer
required init(coder:NSCoder) {
super.init(coder:coder)
}
}

参见 https://developer.apple.com/library/prerelease/iOS/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_319有关指定初始化程序与便利初始化程序的更多信息。

关于ios - 为什么 UIViewController 子类的 Swift 默认初始化程序会两次初始化属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26084583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com