在闭包内使用 unowned for Swift

Use of unowned inside the closure of the closure for Swift

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

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

both should have unowned self or just the second closure should have it?

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

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

a -> b表示a保留b

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

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

另请注意,即使backgroundQueue确实保留outerBlock,该块将在执行后释放,因此如果自我保留backgroundQueue,则保留循环将不会持续。


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

a -x- b 表示 a use b without retain it (unowned)

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

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