我正在创建一个像这样的单例实例
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)
如果你声明currentUser为,则不能这样做let.应该是var,或者更好private (set) var.你也无法分配currentUser与nil如果它的类型是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)
| 归档时间: |
|
| 查看次数: |
10706 次 |
| 最近记录: |