当前位置:  开发笔记 > IOS > 正文

如何重置单例实例?

如何解决《如何重置单例实例?》经验,为你挑选了2个好方法。

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

static let currentUser = User()

private override init() {
    super.init()
    // custom initialisation
}

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



1> R Menke..:

我使用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")
    }
}



2> courteouselk..:

如果你声明currentUser为,则不能这样做let.应该是var,或者更好private (set) var.你也无法分配currentUsernil如果它的类型是User(推测从你的时刻分配的方式).相反,它应该是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,是的.但是如果稍后您将尝试再次从那里读取,将自动创建一个新实例.

但是要小心多线程访问.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有