在Swift关闭的闭包内使用无主

时间:2015-01-21 20:58:30

标签: ios swift memory-management

我在一个闭包里面有一个闭包,第二个闭包使用self,所以两个都应该有无主的自我,或者只是第二个闭包应该有它?

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

2 个答案:

答案 0 :(得分:6)

这是保留图没有 unowned,它没有任何周期,因此您不需要unowned来破坏任何内容。

a -> b表示保留b

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

仅当self保留任何块时才会形成循环。

另请注意,即使backgroundQueue保留outerBlock,该块也会在执行后释放,因此如果自我保留backgroundQueue,保留周期将不会保留。


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

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

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

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

答案 1 :(得分:1)

  

两者都应该拥有无主的自我,或者只有第二个封闭应该拥有它?

以上都不是。如果您只是dispatch_async[unowned self]是错误的。在两个地方删除它。 都不需要它。