引用嵌套块内的弱自我

问题描述 投票:39回答:2

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

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

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

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

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

__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
    [weakerSelf doSomething];
}
ios memory-management automatic-ref-counting block retain-cycle
2个回答
19
投票

取决于。

仅在实际存储块时才创建保留周期(因为self指向该块,而块指向self)。如果您不打算存储任何一个块,则使用对self的强引用就足够了---块将在执行后首先释放,然后将其指向self的指针释放。 >

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


60
投票

您的代码可以正常工作:弱引用不会引起保留周期,因为您明确指示ARC不要增加弱对象的keepCount。但是,为了获得最佳实践,应该使用弱对象为对象创建强引用。这也不会创建一个保留周期,因为该块内的强指针将仅在该块完成之前才存在(唯一的作用域是该块本身)。

© www.soinside.com 2019 - 2024. All rights reserved.