【问题标题】:Initializing UIView init AFTER its superclass init?在其超类初始化之后初始化 UIView 初始化?
【发布时间】:2016-08-04 05:53:05
【问题描述】:

查看斯坦福 iOS 9 课程 here 的讲座幻灯片,他正在创建一个带有两个初始化器的新 UIView(一个是 UIView 是从情节提要创建的,一个是在代码中创建的) )。以下代码写在该特定幻灯片的底部:

    func setup() {....}  //This contains the initialization code for the newly created UIView

    override init(frame: CGRect) {  //Initializer if the UIView was created using code.
        super.init(frame: frame)
        setup()
    }
    required init(coder aDecoder: NSCoder) {  //Initializer if UIView was created in storyboard
        super.init(coder:aDecoder)
        setup()
    }

规则是您必须先初始化所有自己的属性,然后才能从超类中获取 init。那么为什么在这种情况下,他在初始化自己 setup() 之前调用他的超类 init super.init?这不违反以下规则吗:

安全检查 1 指定的初始化程序必须确保其类引入的所有属性在委托给超类初始化程序之前都已初始化。

如上所述,一个对象的内存只有在其所有存储属性的初始状态已知时才被认为是完全初始化的。为了满足这个规则,指定的初始化器必须确保在它传递链之前初始化它自己的所有属性。

【问题讨论】:

    标签: ios swift xcode uiview initialization


    【解决方案1】:

    我还没有看到这个示例中的所有其余代码,但规则是在调用 super.init() 之前必须初始化您的属性(即它们占用的内存必须设置为某个初始值) ,并不是说您不能运行额外的设置代码。

    您甚至可以通过声明您的属性lazy var 或使用自动初始化为nilvar 选项来避免对您的属性进行非真正初始化。然后,您可以在致电 super.init() 后设置它们。

    例如:

    class Foo: UIView {
        var someSubview: UIView!  // initializes automatically to nil
    
        lazy var initialBackgroundColor: UIColor? = {
            return self.someSubview.backgroundColor
        }()
    
        init() {
            super.init(frame: .zero)
            setup()          // do some other stuff
        }
    
        func setup() {
            someSubview = UIView()
            someSubview.backgroundColor = UIColor.whiteColor()
            addSubview(someSubview)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      相关资源
      最近更新 更多