gpt4 book ai didi

objective-c - 使用 block 在 `self` 上保留循环

转载 作者:IT老高 更新时间:2023-10-28 12:16:41 27 4
gpt4 key购买 nike

恐怕这个问题很基础,但我认为它与许多陷入困境的 Objective-C 程序员有关。

我听说,由于 block 捕获其中引用的局部变量作为 const 副本,因此在 block 中使用 self 可能会导致保留周期,如果那样的话 block 被复制。因此,我们应该使用 __block 来强制 block 直接处理 self 而不是复制它。

__block typeof(self) bself = self;
[someObject messageWithBlock:^{ [bself doSomething]; }];

而不仅仅是

[someObject messageWithBlock:^{ [self doSomething]; }];

我想知道的是:如果这是真的,有没有办法可以避免丑陋(除了使用GC)?

最佳答案

严格来说,它是一个 const 副本这一事实与这个问题无关。 block 将保留创建时捕获的任何 obj-c 值。碰巧 const-copy 问题的解决方法与保留问题的解决方法相同;即为变量使用__block存储类。

无论如何,要回答您的问题,这里没有真正的选择。如果您正在设计自己的基于 block 的 API,并且这样做是有意义的,那么您可以让 block 作为参数传递 self 的值。不幸的是,这对大多数 API 来说没有意义。

请注意,引用 ivar 有完全相同的问题。如果您需要在 block 中引用 ivar,请使用属性或使用 bself->ivar


附录:当编译为 ARC 时,__block 不再中断保留周期。如果要为 ARC 编译,则需要使用 __weak__unsafe_unretained 代替。

关于objective-c - 使用 block 在 `self` 上保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4352561/

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