gpt4 book ai didi

ios - 在 Swift 闭包的闭包内部使用 unowned

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:25 24 4
gpt4 key购买 nike

我在一个闭包中有一个闭包,第二个闭包使用 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保留任何 block 时,才形成循环。

另请注意,即使 backgroundQueue 确实保留 outerBlock,该 block 将在执行后释放,因此如果自保留 backgroundQueue,保留周期不会坚持。


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

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com