恐怕这个问题很基础,但我认为它与许多陷入困境的 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 - 在 Objective-C 中,我为什么要检查 self = [supe
ios - 处理 NSDateFormatter 语言环境 "feature"的最佳方法是什么?
objective-c - 在 View Controller 之间进行通信的最佳方式是什么?
objective-c - Objective-C 可以打开 NSString 吗?
ios - 如何将本地 html 文件加载到 UIWebView