42

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

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

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

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

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

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

2 回答 2

60

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

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf) {
        ...
    }
}];
于 2013-06-14T09:31:18.770 回答
19

这取决于。

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

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

于 2013-06-14T09:22:13.960 回答