14.3 析构器
与构造过程相反,实例最后释放的时候,需要清除一些资源,这个过程就是析构过程。在析构过程中也会调用一种特殊的方法deinit
,称为析构器。析构器deinit
没有返回值,也没有参数,所以不能重载。析构函数只适用于类类型,不能应用于枚举和结构体。
类似的方法在C++中称为析构函数,不同的是,C++中的析构函数常常用来释放不再需要的实例内存资源。而在Swift 中,内存管理采用自动引用计数(ARC),不需要在析构器释放不需要的实例内存资源,但是还是有一些清除工作需要在这里完成,如关闭文件等处理。
下面看示例代码:
class Rectangle {
var width : Double
var height : Double
init(width : Double, height : Double) {
self.width = width
self.height = height
}
init(W width : Double,H height : Double) {
self.width = width
self.height = height
}
deinit { ①
println("调用析构器...")
self.width = 0.0
self.height = 0.0
}
}
var rectc1 : Rectangle? = Rectangle(width : 320, height : 480) ②
println("长方形:\(rectc1!.width) x \(rectc1!.height)")
rectc1 = nil ③
var rectc2 : Rectangle? = Rectangle(W : 320, H : 480) ④
println("长方形:\(rectc2!.width) x \(rectc2!.height)")
rectc2 = nil ⑤
上述代码第①行使用deinit
关键字定义了析构器,在这个析构器中重新设置了存储属性值。第②行代码创建了Rectangle
实例rectc1
。注意rectc1
类型是Rectangle?
,这说明rectc1
是可选类型,可以被赋值为nil
,类似地,第④行代码也创建了Rectangle
可选类型实例rectc2
。可选类型在使用时后面要加“!
”,如rectc1!.width
。
那么什么时候调用析构器呢?实例被赋值为nil
,表示实例需要释放内存,在释放之前先调用析构器,然后再释放。代码第③行和第④行是触发调用析构器的条件。
运行结果如下:
长方形:320.0 x 480.0
调用析构器...
长方形:320.0 x 480.0
调用析构器...
在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-7 运行应用
图 14-8 运行应用的日志信息
关于iOS的其他知识我们先不用考虑,只要能够通过上述步骤创建一个iOS测试工程,并且能够运行测试就可以了,其他深层次的内容我们会在第20章再详细解释。