[英]How to reset singleton instance?
我正在創建一個這樣的單例實例
static let currentUser = User()
private override init() {
super.init()
// custom initialisation
}
如何重置此實例或設置回零?
我用一個optional
Singleton 實例創建了我所有的 Singleton。 但是我也把它設為private
並使用一個函數來獲取它。 如果 Singleton 為nil
則它會創建一個新實例。
這實際上是設置單例的唯一好方法。 如果您有一個無法取消初始化的常規對象,則是內存問題。 單例沒有什么不同,只是你必須編寫一個函數來完成它。
單身人士必須完全自我管理。 這意味着從 init 到 deinit。
我在github上有幾個用於 Singeltons 的模板,其中一個具有完全實現的讀/寫鎖。
class Singleton {
private static var privateShared : Singleton?
class func shared() -> Singleton { // change class to final to prevent override
guard let uwShared = privateShared else {
privateShared = Singleton()
return privateShared!
}
return uwShared
}
class func destroy() {
privateShared = nil
}
private init() {
print("init singleton")
}
deinit {
print("deinit singleton")
}
}
如果將currentUser
聲明為let
,則不能這樣做。 它應該是var
,或者最好還是private (set) var
。 如果currentUser
的類型為User
(根據您目前的分配方式推斷),則您也不能使用nil
分配currentUser
。 相反,它應該是User?
.
例如,這樣的事情:
/// ...
static private (set) var currentUser: User? = User()
static func resetCurrentUser() {
currentUser = nil
}
// ...
private (set)
允許在當前文件的范圍內更改屬性,對於您的其余代碼,它將被視為let
。 然后可以使用方法resetCurrentUser()
將其設置為nil
。
甚至這個:
// ...
private static var _currentUser: User?
static var currentUser: User {
if _currentUser == nil { _currentUser = User() }
return _currentUser!
}
static func resetCurrentUser() {
_currentUser = nil
}
// ...
您可以將currentUser
作為計算屬性,保證返回一個值。 所以你可以將用戶重置為nil
,是的。 但是,如果稍后您嘗試再次從那里讀取,則會自動創建一個新實例。
但是要小心多線程訪問。
所有你想要的都是可能的,但非常不推薦:) 因為單例設計不應該回落到零。
首先,如果你想改變currentUser
,它必須是var
。 然后如果你想讓它為零,它必須是可選類型,你應該在使用時解開它。
static var currentUser: User? = User()
我建議不要更改currentUser
或使其非靜態(例如,某些UsersManager
的屬性。
您也可以更改currentUser
屬性(如name
、 loggedIn
)。 最后,看看這個答案: https : //stackoverflow.com/a/28398974/326017 - 它描述了你的情況。
接受的答案是有效的,但如果你不想處理可選項,你可以創建一個private
setter:
class Singleton {
static private(set) var shared: Singleton = Singleton()
static func reset() {
shared = Singleton()
}
private init() {
print("init singleton")
}
deinit {
print("deinit singleton")
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.