在闭包中使用无主引用

时间:2015-07-23 10:59:19

标签: swift closures

The Swift Programming Language文档指出:

  

当闭包和它捕获的实例将始终相互引用时,将闭包中的捕获定义为无主引用,并且将始终同时取消分配。

所以我想到的唯一情况就是这个:

class ClassWithClosure {
  lazy var someClosure: () -> String = {
    [unowned self] in
    self.myMethod()
  }

  func myMethod(){

  }
}

是否有更多场景可以同时解除分配闭包和实例?

2 个答案:

答案 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)
        }
    }
}