Понять деинициализацию и наследование быстрым языком

Скажем, у меня есть два класса: базовый класс и подкласс вроде этого:

class Base{
    var name: String?
    init() {
       name = "The base class"
    }

    deinit {
       println("call Deinitialization in base class")
       name = nil
    }
}

class Sub: Base{
    var subName: String?
    init() {
     super.init()
     subName = "The sub class"
    }

    deinit {
       println("call Deinitialization in sub class")
       subName = nil
       // does it really call super.deinit() ?
       // or assign name = nil ?
    }
}

Когда вызывается деинициализатор подкласса, вызывает ли он super.deinit() для назначения переменной name значение nil? Или мне нужно назначить вручную в деинициализаторе подкласса?

Ответы

Ответ 1

В вашем подклассе вы можете иметь deinit.

Если вы делаете

    let x = Sub()

вы увидите, что сначала вызываемый deinit является внутри внутри Sub(), после чего вызывается base deinit. Поэтому да <<26 > вызывается, но после подкласса.

Также в книге говорится (стр. 286):

Вам не позволено самостоятельно вызывать деинициализатор. Деинициализаторы суперкласса наследуются по их подклассам, а суперкласс deinitializer автоматически вызывается в конце подкласса деинициализатор. Суперэлементы деинициализаторы всегда называемый, даже если подкласс не предоставляет свой собственный деинициализатор.

Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги. https://itun.es/us/jEUH0.l

Ответ 2

Деинициализаторы суперкласса наследуются по своим подклассам, а деинициализатор суперкласса автоматически вызывается в конце реализация деанициализатора подкласса. Суперэксклюзивные деинициализаторы всегда называется, даже если подкласс не предоставляет свои собственные deinitializer.

Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги. https://itun.es/us/jEUH0.l