如何重置单例实例?

gpi*_*ler 13 ios swift

我正在创建一个像这样的单例实例

static let currentUser = User()

private override init() {
    super.init()
    // custom initialisation
}
Run Code Online (Sandbox Code Playgroud)

如何重置此实例或重置为nil?

R M*_*nke 35

我使用optionalSingleton实例创建了所有单身人士.但是我也做了这个private并使用函数来获取它.如果Singleton是nil它创建一个新实例.

这实际上是设置Singleton的唯一好方法.如果你有一个常规对象,你无法取消初始化它是一个内存问题.单身人士没有什么不同,除了你必须写一个功能来做它.

单身人士必须完全自我管理.这意味着从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")
    }
}
Run Code Online (Sandbox Code Playgroud)


cou*_*elk 7

如果你声明currentUser为,则不能这样做let.应该是var,或者更好private (set) var.你也无法分配currentUsernil如果它的类型是User(推测从你的时刻分配的方式).相反,它应该是User?.

例如,像这样:

/// ...

static private (set) var currentUser: User? = User()

static func resetCurrentUser() {
    currentUser = nil
}

// ...
Run Code Online (Sandbox Code Playgroud)

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
}

// ...
Run Code Online (Sandbox Code Playgroud)

您可以使用currentUser计算属性来保证返回值.所以你可以重置用户nil,是的.但是如果稍后您将尝试再次从那里读取,将自动创建一个新实例.

但是要小心多线程访问.


小智 5

接受的答案是有效的,但是如果您不想处理选项,您可以创建一个private设置器:

class Singleton {

    static private(set) var shared: Singleton = Singleton()

    static func reset() {
        shared = Singleton()
    }

    private init() {
        print("init singleton")
    }

    deinit {
        print("deinit singleton")
    }
}
Run Code Online (Sandbox Code Playgroud)