假设我已经使用
创建了一个弱自我__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
...
}];
在该区块内,如果我嵌套另一个区块:
[weakSelf doAnotherBlockOperation:^{
[weakSelf doSomething];
}
会创建一个保留周期吗?我是否需要为weakSelf创建另一个弱引用?
__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
[weakerSelf doSomething];
}
答案 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。