block中调用对象的实例变量导致循环引用

今天在重构公司以前的代码时,由于公司的需求,当从一个当前页面退出时,要终止该页面的所有网络请求。于是我在dealloc中添加了取消网络请求的方法,但在实际的操作中却发现,dealloc方法在退出页面时被没有被调用,而是等到了网络请求结束后才会调用。然后我想到了应该是网络请求中block的循环引用。最后我发现公司以前的对象都是实例变量,也就是下划线的这种形式。比如:

1
2
3
4
@interface TestVC (){
BOOL _isToOuter;
}
@end

这就导致了循环引用的问题。然后我就把实例变量都改成了属性的形式,再加上了

1
__weak typeof(self) weakSelf = self;

解决了问题,然后我在想能不能就用实例变量来解决这个问题,然后我在网上查了方法,找到了可行的办法,如下:

1
2
3
4
5
6
7
8
9
10
11
-(void)test{
NeedABlockObj* obj=[[NeedABlockObj alloc] init];

__typeof (&*self) __weak weakSelf = self;
obj.aBlock = ^(int to){
//不把weak 转为strong,则无法编译通过。
__typeof (&*self) strongSelf = weakSelf;

strongSelf->_isToOuter = YES;
};
}

这种方法虽然也能解决问题,但是strongSelf->这种风格在OC中很少见,是C++的引用风格,所以我想了想还是放弃了这种方式,全部改为属性,虽然麻烦了点,看看后续还能不能找到更好的方法来解决。