当前位置: 首页 > 面试题库 >

了解快速语言中的取消初始化和继承

李良策
2023-03-14
问题内容

假设我有两个类:基类和子类,如下所示:

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()nil来给name变量赋值?还是我必须在子类的反初始化器中手动分配?


问题答案:

您可以选择deinit在子类中包含一个内部。

如果你这样做

    let x = Sub()

您会看到首先被deinit调用是内部调用Sub(),然后base
deinit被调用。所以是,super.deinit()但在子类之后被调用。

该书还说(第286页):

您不允许自己调用反初始化程序。超类反初始化器由其子类继承,并且超类反初始化器在子类反初始化器实现的末尾自动调用。即使子类没有提供自己的反初始化器,也总是会调用超类反初始化器。

摘录自:苹果公司“ The Swift Programming
Language”。iBooks。https://itun.es/us/jEUH0.l



 类似资料:
  • 类的继承和初始化 所有类的存储属性(包括从它的父类继承的所有属性)都必须在初始化期间分配初始值 Swift为类类型定义了两种初始化器以确保所有的存储属性接收一个初始值. 这些就是所谓的指定初始化器和便捷初始化器 指定初始化器是类的主要初始化器. 指定的初始化器可以初始化所有那个类引用的属性并且条用合适的父类初始化器来继续这个初始化过程给父类链 类偏向于少量初始化器, 并且一个类通常只有一个指定初始

  • 问题内容: 我是python的初学者。我无法理解继承和。 结果: 还行吧。但我替换为 结果: 在这种情况下,如何访问? 问题答案: 在第一种情况下,是扩展类,并且由于您没有重新定义in中命名的特殊方法,因此它继承自。 当类定义 方法时,类实例化将自动为新创建的类实例调用。 在第二种情况下,由于要重新定义,因此如果要扩展其行为,则需要在超类()中显式调用它。

  • 主要内容:变量初始化的标准格式,编译器推导类型的格式,短变量声明并初始化正如上一节《 Go语言变量声明》中提到的 Go语言在声明变量时,自动对变量对应的内存区域进行初始化操作。每个变量会初始化其类型的默认值,例如: 整型和浮点型变量的默认值为 0 和 0.0。 字符串变量的默认值为空字符串。 布尔型变量默认为 bool。 切片、函数、指针变量的默认为 nil。 当然,依然可以在变量声明时赋予变量一个初始值。 回顾C语言 在C语言中,变量在声明时,并不会对变量对应内存区

  • 问题内容: 我正在尝试在中创建函数并从中创建实例。问题是我在文件中看不到它,并且在初始化时找不到该函数。我有一个定义如下的函数: 我什至尝试放入推杆,但再次出现相同的错误。还有什么我想念的吗?如何使构造函数对代码可见? 我为此阅读以下内容: https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_pr

  • 问题内容: 当我这样做时,从编译器得到投诉 但是,如果我只添加 ? 在如下所示的 AppDelegate 末尾,错误消失了。 除非我错了,否则我看不到与此错误相关的关键字。 问题答案: 该错误可以得到改善,但是第一个版本的问题是您有一个成员变量,该成员变量没有默认值。Swift中的所有变量必须始终具有一个值。这意味着您必须在没有的初始化程序中进行设置,也可以在线提供默认值。 当您将其设为可选时,默

  • 问题内容: 有什么方法可以通过大量(> 1000)类来加快javax.xml.bind.JAXBContexts的初始化?在我们的XML繁重的应用程序中,启动时间约为10分钟,并且主要由JAXBContexts的初始化时间组成。:-( 我们正在JDK 1.5和org.jvnet.jaxb2.maven2.maven-jaxb2-plugin中使用Sun的JAXB实现,以从XSD生成代码。 澄清:问