recherche

Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours855

répondre à tous(4)je répondrai

  • 迷茫

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

    Qu'il s'agisse d'une référence circulaire n'a rien à voir avec la méthode appelante , elle est uniquement liée à la relation de référence.

    Dans votre exemple, la boucle de référence est vc --> mainModel --> netRequestCallBack --> ("-->" indique une relation de référence)

    La condition préalable pour que l'objet soit libéré est que l'objet ne soit pas détenu par d'autres objets. Dans votre exemple, vc est détenu par netRequestCallBack, il ne sera donc pas publié par .

    La façon de rompre le cycle de référence est d'utiliser __weak pour déclarer les variables capturées par le bloc.
    c'est-à-dire

    __weak AUIViewController *tmpVC = vc;
    vc.mainModel.netRequestCallBack = ^(NSError *error){
        [[tmpVC navigationController] pushViewController:vc animated:YES];
    };

    Le problème avec la publication de vc est que vc n'est pas détenu par d'autres objets. La bonne solution devrait être de trouver le vc à partir du contrôleur de navigation actuel ou d'une autre pile vc, puis d'exploiter le vc.

    répondre
    0
  • 高洛峰

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

    Utilisez copy pour l'attribut block, puis ajoutez __strong __typeof(weaksSelf) strongSelf = lowSelf, mais la logique de votre code est bizarre

    répondre
    0
  • 天蓬老师

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

    Modifiez votre bloc avec __strong __typeof(&*weaksSelf) strongSelf = lowSelf

    répondre
    0
  • 高洛峰

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

    Ne parlons pas de la question des références circulaires

    [[vc navigationController] pushViewController:vc animated:YES];
    

    Il y a un problème avec cette phrase. Si vc n'est pas poussé, vc.navigationController sera-t-il nul ? Si vc.navgationController est nul, vc peut-il être poussé ?

    répondre
    0
  • Annulerrépondre