代码如下,在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
没有了持有者了,也是被释放了。
所以,请问有什么方法可以解决这个吗?
迷茫2017-04-18 09:57:43
それが循環参照であるかどうかは、呼び出しメソッド とは関係がなく、参照関係 にのみ関係します。
あなたの例では、参照ループは vc --> mainModel --> netRequestCallBack --> vc です。 (「-->」は参照関係を示します)
オブジェクトが解放される前提条件は、そのオブジェクトが他のオブジェクトによって保持されていないことです。あなたの例では、vc は netRequestCallBack によって保持されているため、 によって解放されません。
参照サイクルを中断する方法は、__weak を使用してブロックによってキャプチャされた変数を宣言することです。
つまり
解放された vc の問題は、vc が他のオブジェクトによって保持されていないことです。正しい解決策は、現在の NavigationController または他の vc スタックから vc を見つけて、vc を操作することです。
高洛峰2017-04-18 09:57:43
block 属性に copy を使用し、__strong __typeof(weaksSelf) StrongSelf =weakSelf を追加しますが、コードのロジックが奇妙です
高洛峰2017-04-18 09:57:43
循環参照の問題については話さないようにしましょう
リーリーこの文には問題があります。vc がプッシュされていない場合、vc.navigationController は Nil になりますか? vc.navgationController が nil の場合、vc はプッシュできますか?