ios - 保留 block 内部 block 的循环

标签 ios objective-c objective-c-blocks

我是否必须连续声明弱引用以打破嵌套block的保留循环?

__weak typeof(self) weakSelf = self;
[self setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    typeof(self) strongSelf = weakSelf;
    [strongSelf doSomething];
    [strongSelf setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        //do I need to create another weak reference to strongSelf for this block?
        [strongSelf doSomething];
    }];  
}];

最佳答案

恐怕是这样。 [strongSelf setMyBlock:<inner block>]会导致self保留内部 block 。如果内部 block 对 self 有强引用,就是一个循环。 strongSelf 的事实变量被分配来自一个__weak限定变量本来没有什么区别。

正如其他一些用户提到的,您可以使用原始的 weakSelf而不是创建一个新的。您创建 strongSelf 的原因 block 中的引用是否则 self block 运行时可能会被释放。 strongSelf要么结束 nil (如果 selfstrongSelf 被分配之前被释放,但这不会造成伤害)否则 self在执行 block 时不会被释放,因为你有一个强引用。在你对self有强烈引用的时候, 原文weakSelf 可以安全使用,因为self不会被释放。

关于ios - 保留 block 内部 block 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30602436/

相关文章:

ios - PanGesture 错误的功能

ios - 在选项卡栏 Controller 中将数据从一个 View 传递到另一个 View 未按时传递

iphone - 调用 dismissViewControllerAnimated 时的 exc_bad_access

javascript - 使用 mp3 元数据或 HTML 在 iPhone 锁定屏幕上显示作品和轨道名称

ios - TableView在reloadData上崩溃-“无法识别的选择器已发送到实例”

objective-c - 警告 ASIHttpRequest

objective-c - 将小数点限制在需要的范围内

objective-c - 调用指定返回类型和参数的内联 block

ios - copy__destroy_helper_block_ 在第 0 行崩溃

iOS代码覆盖率: @implementation Not Hit?