Понять деинициализацию и наследование быстрым языком
Скажем, у меня есть два класса: базовый класс и подкласс вроде этого:
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