我在一个闭包内有一个闭包,第二个闭包使用 self,所以两者都应该有 unowned self 还是只有第二个闭包应该有它?

dispatch_async(backgroundQueue) { [unowned self] () -> Void in
    dispatch_async(dispatch_get_main_queue(), { [unowned self] () -> Void in
        self.doSomething()
    })
}

最佳答案

这是没有 unowned 的保留图,它没有任何循环,因此您不需要 unowned 来破坏任何东西。
a -> b 表示 a 保留 b

backgroundQueue -> outerBlock -> self
                       |          ^
                       V          |
      mainQueue -> innerBlock -----

只有当 self 保留任何块时,才会形成循环。

还要注意,即使 backgroundQueue 确实保留了 outerBlock ,block 会在执行后被释放,所以如果自己保留 backgroundQueue ,保留周期将不会持续。

这是带有 unowned(您的代码)的保留图
a -x- b 表示使用 b 而不保留它(无主)
  backgroundQueue -> outerBlock -x- self
                           |          |
                           V          x
          mainQueue -> innerBlock -----

你可以看到 self 没有被任何东西保留,这意味着当 innerBlock 被执行时,self 可能会被释放并导致你的应用程序崩溃。

关于ios - 在 Swift 的闭包内使用 unowned,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28076681/

10-10 08:26