/*
析構方法
對象的記憶體被回收前夕被隐式調用的方法, 對應OC的dealloc方法
主要執行一些額外操作, 例如釋放一些持有資源, 關閉檔案, 斷開網絡等
*/
class FileHandler{
var fd: Int32? // 檔案描述符
// 指定構造器
init(path:String){
// 需要打開的檔案路徑, 打開方式(隻讀)
// open方法是UNIX的方法
let ret = open(path, O_RDONLY)
if ret == -1{
fd = nil
}else{
fd = ret
}
print("對象被建立")
}
// 析構方法
deinit{
// 關閉檔案
if let ofd = fd{
close(ofd)
}
print("對象被銷毀")
}
}
var fh:FileHandler? = FileHandler(path: "/Users/Jonathan_Lee/Desktop/老員工獎.xlsx")
// 當對象沒有任何強引用時會被銷毀
fh = nil
/*
析構方法的自動繼承
父類的析構方法會被自動調用, 不需要子類管理
*/
class Person {
var name:String
init(name:String){
self.name = name
print("Person init")
}
deinit{
print("Person deinit")
}
}
class SuperMan: Person {
var age:Int
init(age:Int){
self.age = age
super.init(name: "gezi")
print("SuperMan init")
}
deinit{
// 如果父類的析構方法不會被自動調用,那麼我們還需要關心父類
// 但是如果這樣做對子類是比較痛苦的
print("SuperMan deinit")
}
}
var sm: SuperMan? = SuperMan(age: 30)
sm = nil