在本章中,你将學會
Destructor
析構函數的使用方法。
前言
和
Apple
官網或者網上分享的教程類文章不同,我将以實際開發角度講述
Swift
語言的一些概念和用法,友善大家更好地學習和掌握
Swift
語言。
這同時也是對自己學習
Swift
語言過程的知識整理。
如有錯誤,以你為準。
析構函數的定義
析構函數,也叫析構器。
它是在對象銷毀的時候自動調用,完成執行個體清理工作以釋放資源的函數。
在
Swift
語言中,我們使用
Initializer
構造函數,在執行個體初始化時調用,以實作初始化的業務場景。
而當我們釋放執行個體時,我們還需要使用
Destructor
析構函數進行資源的釋放,達到記憶體優化的目的。
這就像是我們使用電腦一樣,打開應用時我們調用
Initializer
構造函數初始化執行個體,然後切換應用的時候,系統就需要調用
Destructor
析構函數釋放執行個體。
與
Initializer
構造函數不同點是,
Initializer
構造函數可以在
Class
類、
Struct
結構體中使用,而
Destructor
析構函數隻适用于
Class
類,每個類最多隻能有一個析構器,而且析構器不帶任何參數和圓括号。
析構函數的使用
我們建立一個
PlayGround
項目,命名為
SwiftDestructor
。
使用
Initializer
構造函數我們用到了
init()
方法,使用
Destructor
析構函數我們則需要用到
deinit
關鍵字。示例:
import UIKit
class appInformation {
var appName: String
var appVersion: String
var appAuthor: String
// 構造函數
init(appName: String, appVersion: String, appAuthor: String) {
self.appName = appName
self.appVersion = appVersion
self.appAuthor = appAuthor
print("調用構造函數")
}
// 析構函數
deinit {
print("調用析構函數")
}
}
上述代碼中,我們定義了一個
appInformation
類,我們聲明了三個存儲變量
appName
、
appVersion
、
appAuthor
,然後我們通過構造函數對執行個體初始化。
然後,我們使用
deinit
關鍵字使用
Destructor
析構函數,當我們執行個體被釋放時,我們列印輸出下需要的結果。
調用的方法也比較簡單,示例:
var Destructor: appInformation? = appInformation(appName: "我的App", appVersion: "1.0.0", appAuthor: "文如秋雨")
Destructor = nil
我們建立一個
appInformation
執行個體時,我們會向
appInformation
對象中給存儲變量指派,
appInformation
執行個體存儲在一個
Destructor
的可選類型變量當中。
使用完成之後,我們讓聲明的可變類型變量
Destructor
為
nil
,這樣在執行後,析構函數
deinit
會被立即調用列印輸出,
Destructor
占用的記憶體會随之釋放。
析構函數小結
之是以使用
Destructor
析構函數,我們更多地考慮在多個執行個體被同時調用時,由于
Initializer
構造函數初始化帶來的資源占用,比如背景通知的移除。
這樣當我們調用執行個體并初始化後,就可以調用
Destructor
析構函數釋放執行個體所帶來的資源占用,進而避免不必要的資源浪費,優化記憶體管理。
本章代碼
import UIKit
class appInformation {
var appName: String
var appVersion: String
var appAuthor: String
// 構造函數
init(appName: String, appVersion: String, appAuthor: String) {
self.appName = appName
self.appVersion = appVersion
self.appAuthor = appAuthor
print("調用構造函數")
}
// 析構函數
deinit {
print("調用析構函數")
}
}
var Destructor: appInformation? = appInformation(appName: "我的App", appVersion: "1.0.0", appAuthor: "文如秋雨")
Destructor = nil