ios - 在嵌套 block 中引用 weak self

标签 ios memory-management automatic-ref-counting block retain-cycle

假设我已经创建了一个 weak self using

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
        ...
}];

在该 block 内,如果我嵌套另一个 block :

[weakSelf doAnotherBlockOperation:^{
    [weakSelf doSomething];
}

它会创建一个保留周期吗?我是否需要创建另一个对 weakSelf 的弱引用?

__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
    [weakerSelf doSomething];
}

最佳答案

您的代码可以正常工作:弱引用不会导致保留循环,因为您明确指示 ARC 不要增加弱对象的 retainCount。然而,为了获得最佳实践,您应该使用弱引用创建对象的强引用。这也不会创建保留循环,因为 block 中的强指针只会存在到 block 完成(它的唯一作用域是 block 本身)。

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf) {
        ...
    }
}];

关于ios - 在嵌套 block 中引用 weak self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17104634/

相关文章:

ios - 后台任务和后台正确获取有什么区别?

ios - 使用 Swift 在 TableView 中的自定义单元格下添加图例

python - 在 StopIteration 时自动从内存中删除生成器对象 (Python)

objective-c - 重用代码时预期的标识符和 ARC 问题

cocoa - 独立重用已声明的强大属性

objective-c - C 库的 Objective C 包装器 : wrapping calls that return Obj-C objects

ios - iPad 总是横向启动

ios - 如何捕获添加的 XIB View 中按钮的点击(注释)

c - 双向链表 - 段错误

C++:std::vector::resize 与 "normal"分配