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

恐怕这个问题很基础,但我认为它与许多陷入困境的 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/

相关文章:

ios - 从后台打开应用程序时不调用 ViewDidAppear

objective-c - ARC 和桥接铸件

objective-c - 在 Objective-C 中,我为什么要检查 self = [supe

ios - 处理 NSDateFormatter 语言环境 "feature"的最佳方法是什么?

ios - UIImageView 方面适合和居中

objective-c - 在 View Controller 之间进行通信的最佳方式是什么?

objective-c - Objective-C 可以打开 NSString 吗?

ios - 如何将本地 html 文件加载到 UIWebView

objective-c - 什么时候应该在 Objective-C 中使用 nil 和 NULL?

ios - 如何将方法调用延迟 1 秒?