引用嵌套块内的弱自我

Enz*_*ran 40 memory-management block ios automatic-ref-counting retain-cycle

假设我已经创建了一个弱自我使用

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
        ...
}];
Run Code Online (Sandbox Code Playgroud)

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

[weakSelf doAnotherBlockOperation:^{
    [weakSelf doSomething];
}
Run Code Online (Sandbox Code Playgroud)

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

__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
    [weakerSelf doSomething];
}
Run Code Online (Sandbox Code Playgroud)

Gia*_*one 60

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

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf) {
        ...
    }
}];
Run Code Online (Sandbox Code Playgroud)

  • 这是一篇博客文章,对这种模式有另一个很好的解释:http://dhoerl.wordpress.com/2013/04/23/i-finally-figured-out-weakself-and-strongself/ (5认同)
  • 关于它的好处是你可以安全地检查当块执行时对象仍然存在的天气.否则你将调用nil,这意味着你的块不会做太多.我建议你看[来自WWDC 2012的这段视频](https://developer.apple.com/videos/wwdc/2012/?id=712);). (3认同)
  • +1表示"块内的强指针只会在块完成之前存在" (3认同)

Geo*_*kov 19

这取决于.

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

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