惰性初始化和 deinit
Lazy initialization and deinit
我想知道是否有可能,在我的视图控制器中,使用惰性 属性 并且在 deinit
方法中仅当它被初始化时调用我的惰性 属性 的方法.下面是一些代码:
fileprivate lazy var session: MySession = {
let session: MySession = MySession()
session.delegate = self
return session
}()
deinit {
session.delete()
}
这样,当deinit
方法中的session.delete()
被调用时,session
还没有被使用(所以还是nil
),就初始化了,然后 delete
被调用。我不想要这个。仅当 session
之前已初始化时,我才想调用 delete
。
有办法实现吗?我是否应该放弃惰性初始化的想法?
您可以使用私有变量来跟踪会话是否已创建。这个例子做了你想要的,我想(来自操场的代码):
class Thing {
private var hasMadeSession: Bool = false
lazy fileprivate var session: Int = {
self.hasMadeSession = true
return 1
}()
deinit {
print(#function)
if self.hasMadeSession {
print("Hello")
}
}
}
var thing: Thing? = Thing()
thing = nil // Prints "deinit"
thing = Thing()
thing?.session
thing = nil // Prints "deinit" and "Hello"
我想知道是否有可能,在我的视图控制器中,使用惰性 属性 并且在 deinit
方法中仅当它被初始化时调用我的惰性 属性 的方法.下面是一些代码:
fileprivate lazy var session: MySession = {
let session: MySession = MySession()
session.delegate = self
return session
}()
deinit {
session.delete()
}
这样,当deinit
方法中的session.delete()
被调用时,session
还没有被使用(所以还是nil
),就初始化了,然后 delete
被调用。我不想要这个。仅当 session
之前已初始化时,我才想调用 delete
。
有办法实现吗?我是否应该放弃惰性初始化的想法?
您可以使用私有变量来跟踪会话是否已创建。这个例子做了你想要的,我想(来自操场的代码):
class Thing {
private var hasMadeSession: Bool = false
lazy fileprivate var session: Int = {
self.hasMadeSession = true
return 1
}()
deinit {
print(#function)
if self.hasMadeSession {
print("Hello")
}
}
}
var thing: Thing? = Thing()
thing = nil // Prints "deinit"
thing = Thing()
thing?.session
thing = nil // Prints "deinit" and "Hello"