保留块内部块的循环
Retain Cycles for Blocks Inside of Blocks
我是否必须连续声明弱引用以打破块内块的保留周期?
__weak typeof(self) weakSelf = self;
[self setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
typeof(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//do I need to create another weak reference to strongSelf for this block?
[strongSelf doSomething];
}];
}];
恐怕是这样。 [strongSelf setMyBlock:<inner block>]
将导致 self
保留内部块。如果内部块对 self
有强引用,那就是一个循环。 strongSelf
变量被分配 来自 一个 __weak
合格变量的事实最初并没有什么不同。
正如其他一些用户提到的,您可以使用原始 weakSelf
而不是创建新的。您在块中创建 strongSelf
引用的原因是,否则 self
可能会在块为 运行 时被释放。 strongSelf
将最终成为 nil
(如果 self
在 strongSelf
被分配之前被释放,但这不会造成伤害)否则 self
将 not 在块执行时被释放,因为你有一个强引用。在你强引用self
期间,原来的weakSelf
也可以安全使用,因为self
不会被释放。
我是否必须连续声明弱引用以打破块内块的保留周期?
__weak typeof(self) weakSelf = self;
[self setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
typeof(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//do I need to create another weak reference to strongSelf for this block?
[strongSelf doSomething];
}];
}];
恐怕是这样。 [strongSelf setMyBlock:<inner block>]
将导致 self
保留内部块。如果内部块对 self
有强引用,那就是一个循环。 strongSelf
变量被分配 来自 一个 __weak
合格变量的事实最初并没有什么不同。
正如其他一些用户提到的,您可以使用原始 weakSelf
而不是创建新的。您在块中创建 strongSelf
引用的原因是,否则 self
可能会在块为 运行 时被释放。 strongSelf
将最终成为 nil
(如果 self
在 strongSelf
被分配之前被释放,但这不会造成伤害)否则 self
将 not 在块执行时被释放,因为你有一个强引用。在你强引用self
期间,原来的weakSelf
也可以安全使用,因为self
不会被释放。