保留块内块的循环

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)

Aar*_*den 6

我想恐怕是的. [strongSelf setMyBlock:<inner block>]将导致self保留内部块.如果内部块具有强引用self,那就是一个循环.事实上,strongSelf变量是一个__weak合格的变量中分配出来的,但这并没有什么不同.

正如其他一些用户所提到的,您可以使用原始weakSelf而不是创建新原始用户.您strongSelf在块中创建引用的原因是,self在块运行时可能会释放该引用. strongSelf将结束nil(如果self在分配之前strongSelf已被释放,但这不会造成任何伤害),或者在执行块self不会释放,因为您有一个强引用.在此期间,你有很强的参考时间self,原来weakSelf可以放心使用,因为self不会被释放.