Tra*_* M. 4 objective-c ios objective-c-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];
}];
}];
Run Code Online (Sandbox Code Playgroud)
我想恐怕是的. [strongSelf setMyBlock:<inner block>]将导致self保留内部块.如果内部块具有强引用self,那就是一个循环.事实上,strongSelf变量是从一个__weak合格的变量中分配出来的,但这并没有什么不同.
正如其他一些用户所提到的,您可以使用原始weakSelf而不是创建新原始用户.您strongSelf在块中创建引用的原因是,self在块运行时可能会释放该引用. strongSelf将结束nil(如果self在分配之前strongSelf已被释放,但这不会造成任何伤害),或者在执行块self时不会释放,因为您有一个强引用.在此期间,你有很强的参考时间self,原来weakSelf是也可以放心使用,因为self不会被释放.