我正在创建一个像这样的单例实例
static let currentUser = User() private override init() { super.init() // custom initialisation }
如何重置此实例或重置为nil?
我使用optional
Singleton实例创建了所有单身人士.但是我也做了这个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") } }
如果你声明currentUser
为,则不能这样做let
.应该是var
,或者更好private (set) var
.你也无法分配currentUser
与nil
如果它的类型是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
,是的.但是如果稍后您将尝试再次从那里读取,将自动创建一个新实例.
但是要小心多线程访问.