The Swift Programming Language文档指出:
当闭包和它捕获的实例将始终相互引用时,将闭包中的捕获定义为无主引用,并且将始终同时取消分配。
所以我想到的唯一情况就是这个:
class ClassWithClosure {
lazy var someClosure: () -> String = {
[unowned self] in
self.myMethod()
}
func myMethod(){
}
}
是否有更多场景可以同时解除分配闭包和实例?
答案 0 :(得分:0)
任何时候ClassWithClosure实例的引用计数命中0,该实例将被释放。由于实例已被取消分配,因此其属性也将被释放。因此,只要释放ClassWithClosure实例,闭包也将被释放。你不能以其他方式告诉同样的事情。我的意思是如果你将someClosure设置为nil,那么它不会导致ClassWithClosure实例的释放。
答案 1 :(得分:0)
我迟到了。刚才为自己调查这些问题。怎么样?
protocol Notifier {
typealias Client = (Data) -> Void
typealias Token = Any
func register(client: Client) -> Token
// The previously registered Consumer is discarded
func deregister(token: Token)
}
class Registrant {
private let name: String
private let notifier: Notifier
private var token: Notifier.Token? = nil
init(name: String, notifier: Notifier) {
self.name = name
self.notifier = notifier
token = notifier.register { [unowned self] (data: Data) in
print("\(self.name) has been notified: \(data)")
}
}
deinit {
if let token = token {
notifier.deregister(token: token)
}
}
}