引用嵌套块内的弱自我

时间:2013-06-14 08:50:11

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

假设我已经使用

创建了一个弱自我
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
        ...
    }];

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

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

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

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

2 个答案:

答案 0 :(得分:60)

您的代码可以正常工作:弱引用不会导致保留周期,因为您明确指示ARC不要增加弱对象的retainCount。但是,对于最佳实践,您应该使用弱对象创建对象的强引用。这不会创建保留周期,因为块中的强指针只会在块完成之前存在(它的唯一范围是块本身)。

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

答案 1 :(得分:19)

取决于。

如果您实际存储了块,则只创建一个保留周期(因为self指向块,而块指向self)。如果你不打算存储任何一个块,那么使用对self的强引用就足够了---块将在执行后首先释放,然后它将释放它指向{{1 }}

在您的特定示例中,除非您执行更多未显示的操作,否则您无需创建任何weakerWeakerEvenWeakerSelfs。