【问题标题】:Use of unowned inside the closure of the closure for Swift在 Swift 的闭包中使用 unowned
【发布时间】:2015-03-20 12:44:41
【问题描述】:

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

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

【问题讨论】:

  • 尝试在纸上画retain graph,你能找到一个循环吗?

标签: ios swift memory-management


【解决方案1】:

这是保留图没有unowned,它没有任何循环,所以你不需要unowned 来破坏任何东西。

a -> b 表示保留 b

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

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

还要注意即使backgroundQueue确实保留outerBlock,块在执行后会被释放,所以如果self-retainbackgroundQueue,retain循环不会保持。


这是保留图 unowned(你的代码)

a -x- b 表示 a 使用 b 而不保留它(无主)

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

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

【讨论】:

  • @DanielG.R.自己画?这并不难。或者您可以使用仪器在运行时检查泄漏。
【解决方案2】:

两者都应该有 unowned self 还是只有第二个闭包应该有它?

以上都不是。如果你只是在做dispatch_async,那么[unowned self] 是一个错误。在这两个地方删除它。 都不需要

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2014-12-20
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多