再谈Initializer in iOS

341 阅读1分钟

深入理解代替单纯记忆

之前写过一篇[《Initializers in Swift Class》],后来发现对初始化方法理解还是不到位,感觉需要遵循的规则太多,太容易忘。找了些资料又看了看,发现之前还是对初始化方法的本质理解的不够

initializer本质

我理解的初始化方法的本质是:创建类,并安全地为类的成员变量赋上初始值

因为当出现复杂的继承关系时,就可能触发不安全或者某些成员变量无法赋值的情况,这里的不安全因素比如说产生无限递归调用

其实不论是Objective C还是Swift,本质是一样的,只是Swift约束更强

initializer规则

具体的规则不再赘述,下面会贴上几篇总结的很棒的文章

一个疑问

在看这些文章时,有一个问题一直百思不得解:

为什么子类的designated initializer中不能调用父类的convenience initializer?

经过一番Google,找到了答案: Why can't Swift initializers call convenience initializers on their superclass?

答案是:为了避免无限循环调用

通过下面的示例代码,一眼就能看出了

class SuperClass {
    init() {
    }

    convenience init(value: Int) {
        // calls init() of the current class
        // so init() for SubClass if the instance
        // is a SubClass
        self.init()
    }
}

class SubClass : SuperClass {
    override init() {
        super.init(value: 10)
    }
}

// let a = SubClass()