簡體   English   中英

如何重置單例實例?

[英]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屬性(如nameloggedIn )。 最后,看看這個答案: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM