ios - 类方法中使用了block,如何避免循环引用?
本文介绍了ios - 类方法中使用了block,如何避免循环引用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
代码如下,在netRequestCallBack
的中的使用了vc
,Xcode会告警提示: 可能导致循环引用。 请问如何消除?
+ (void)JumpToMe {
dispatch_async(dispatch_get_main_queue(), ^{
AUIViewController *vc = [[AUIViewController alloc] init];
vc.mainModel.netRequestCallBack = ^(NSError *error){
[[vc navigationController] pushViewController:vc animated:YES];
};
[vc.mainModel sendNetworking];
});
}
尝试:
对
vc
使用修饰词__block
,但不能解决问题,而且__block
修饰后,vc
仍然是强引用的。对
vc
使用修饰词__weak
,确实消除了Xcode关于循环引用的告警。但netRequestCallBack
运行时,会发现vc
已经被为nil
。
我理解出现这种情况,是在类方法完成后,vc
没有了持有者了,也是被释放了。
所以,请问有什么方法可以解决这个吗?
解决方案
是否是循环引用与调用方法无关,只与引用关系有关。
在你的例子中,引用环为 vc --> mainModel --> netRequestCallBack --> vc。("-->"表示引用关系)
对象被释放的先决条件为该对象不被其他对象持有。而你的例子中vc被netRequestCallBack持有,所以不会被释放。
打破引用环的办法为使用__weak来声明被block捕获的变量。
即
__weak AUIViewController *tmpVC = vc;
vc.mainModel.netRequestCallBack = ^(NSError *error){
[[tmpVC navigationController] pushViewController:vc animated:YES];
};
而对于vc被释放的问题,在于vc没有被别的对象持有。正确的解决办法应该是从当前navigaionController或别的vc栈中,找到该vc,然后对该vc进行操作。
这篇关于ios - 类方法中使用了block,如何避免循环引用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文