且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ios - 类方法中使用了block,如何避免循环引用?

更新时间:2023-02-10 09:15:24

是否是循环引用与调用方法无关,只与引用关系有关。

在你的例子中,引用环为 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进行操作。