14.3 析构器

与构造过程相反,实例最后释放的时候,需要清除一些资源,这个过程就是析构过程。在析构过程中也会调用一种特殊的方法deinit,称为析构器。析构器deinit没有返回值,也没有参数,所以不能重载。析构函数只适用于类类型,不能应用于枚举和结构体。

类似的方法在C++中称为析构函数,不同的是,C++中的析构函数常常用来释放不再需要的实例内存资源。而在Swift 中,内存管理采用自动引用计数(ARC),不需要在析构器释放不需要的实例内存资源,但是还是有一些清除工作需要在这里完成,如关闭文件等处理。

下面看示例代码:

  1. class Rectangle {
  2. var width : Double
  3. var height : Double
  4. init(width : Double, height : Double) {
  5. self.width = width
  6. self.height = height
  7. }
  8. init(W width : Double,H height : Double) {
  9. self.width = width
  10. self.height = height
  11. }
  12. deinit {
  13. println("调用析构器...")
  14. self.width = 0.0
  15. self.height = 0.0
  16. }
  17. }
  18. var rectc1 : Rectangle? = Rectangle(width : 320, height : 480)
  19. println("长方形:\(rectc1!.width) x \(rectc1!.height)")
  20. rectc1 = nil
  21. var rectc2 : Rectangle? = Rectangle(W : 320, H : 480)
  22. println("长方形:\(rectc2!.width) x \(rectc2!.height)")
  23. rectc2 = nil

上述代码第①行使用deinit关键字定义了析构器,在这个析构器中重新设置了存储属性值。第②行代码创建了Rectangle实例rectc1。注意rectc1类型是Rectangle?,这说明rectc1是可选类型,可以被赋值为nil,类似地,第④行代码也创建了Rectangle可选类型实例rectc2。可选类型在使用时后面要加“!”,如rectc1!.width

那么什么时候调用析构器呢?实例被赋值为nil,表示实例需要释放内存,在释放之前先调用析构器,然后再释放。代码第③行和第④行是触发调用析构器的条件。

运行结果如下:

  1. 长方形:320.0 x 480.0
  2. 调用析构器...
  3. 长方形:320.0 x 480.0
  4. 调用析构器...

在Playground环境下测试和运行上述代码,是不会调用析构器的,还需要使用Xcode创建一个iOS应用程序,然后在应用程序中运行这段代码,才会调用析构器。

具体过程是:启动Xcode 6,然后单击File→New→Project菜单,在打开的Choose a template for your new project界面中选择“Single View Application”工程模板(如图14-1所示)。

{%}

图 14-1 选择工程模板

接着单击“Next”按钮,随即出现如图14-2所示的界面。

{%}

图 14-2 新工程中的选项

在图14-2所示的对话框的Product Name中,输入一个工程名称,其他输入项目读者可以参考图14-2,这些输入项目我们会在第20章详细解释,这里不再赘述。设置完相关的工程选项后,单击“Next”按钮,进入下一级界面。根据提示选择存放文件的位置,然后单击“Create”按钮,将出现如图14-3所示的界面。

{%}

图 14-3 新创建的工程

由于我们并不需要运行iOS应用中的那些UI界面,因此在工程中选中AppDelegate.swift、ViewController.swift和Main.storyboard这3个文件,在右键菜单中选择Delete删除这3个文件,之后的Xcode工程界面如图14-4所示。

{%}

图 14-4 删除文件

接着在工程中添加我们测试使用的Swift文件,选择图14-4所示的HelloWorld工程,在右键菜单中选择New File…,弹出如图14-5所示的对话框,选择iOS→Source→Swift File,然后单击“Next”按钮,进入下一级界面,如图14-6所示,在“Save AS”中输入文件名为main,选择存放文件的位置,然后单击“Create”按钮创建Swift文件。

{%}

图 14-5 在工程中添加Swift文件

{%}

图 14-6 保存文件

Swift文件创建成功之后,在main.swift中编写前面介绍的构造器代码,编写完成后我们就可以运行测试了。具有的运行过程是:如图14-7所示,在工具栏中选择运行的模拟器,然后单击左上角的运行按钮{%},iOS应用就会运行,并且会启动一个模拟器,我们不用关心这个模拟器界面,只需要图14-8所示的日志信息就可以了。

14.3 析构器 - 图8

图 14-7 运行应用

{%}

图 14-8 运行应用的日志信息

关于iOS的其他知识我们先不用考虑,只要能够通过上述步骤创建一个iOS测试工程,并且能够运行测试就可以了,其他深层次的内容我们会在第20章再详细解释。