検索

ホームページ  >  に質問  >  本文

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];
    });
}

尝试:

  1. vc使用修饰词 __block,但不能解决问题,而且__block修饰后,vc仍然是强引用的。

  2. vc使用修饰词__weak,确实消除了Xcode关于循环引用的告警。但netRequestCallBack 运行时,会发现vc已经被为nil
    我理解出现这种情况,是在类方法完成后,vc没有了持有者了,也是被释放了。

所以,请问有什么方法可以解决这个吗?

PHP中文网PHP中文网2771日前852

全員に返信(4)返信します

  • 迷茫

    迷茫2017-04-18 09:57:43

    それが循環参照であるかどうかは、呼び出しメソッド とは関係がなく、参照関係 にのみ関係します。

    あなたの例では、参照ループは vc --> mainModel --> netRequestCallBack --> vc です。 (「-->」は参照関係を示します)

    オブジェクトが解放される前提条件は、そのオブジェクトが他のオブジェクトによって保持されていないことです。あなたの例では、vc は netRequestCallBack によって保持されているため、 によって解放されません。

    参照サイクルを中断する方法は、__weak を使用してブロックによってキャプチャされた変数を宣言することです。
    つまり

    リーリー

    解放された vc の問題は、vc が他のオブジェクトによって保持されていないことです。正しい解決策は、現在の NavigationController または他の vc スタックから vc を見つけて、vc を操作することです。

    返事
    0
  • 高洛峰

    高洛峰2017-04-18 09:57:43

    block 属性に copy を使用し、__strong __typeof(weaksSelf) StrongSelf =weakSelf を追加しますが、コードのロジックが奇妙です

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:57:43

    __strong __typeof(&*weaksSelf) StrongSelf =weakSelf を使用してブロックを変更します

    返事
    0
  • 高洛峰

    高洛峰2017-04-18 09:57:43

    循環参照の問題については話さないようにしましょう

    リーリー

    この文には問題があります。vc がプッシュされていない場合、vc.navigationController は Nil になりますか? vc.navgationController が nil の場合、vc はプッシュできますか?

    返事
    0
  • キャンセル返事