ios - 类方法中使用了block,如何避免循环引用?
PHP中文网
PHP中文网 2017-04-18 09:55:43
0
4
860

代码如下,在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中文网

认证0级讲师

모든 응답(4)
迷茫

순환 참조인지는 호출 방법과는 관계 없고 참조 관계에만 관련됩니다.

귀하의 예에서 참조 루프는 vc --> mainModel --> ("-->"는 참조 관계를 나타냅니다)

해제할 객체의 전제 조건은 해당 객체가 다른 객체에 의해 보유되지 않는다는 것입니다. 귀하의 예에서 vc는 netRequestCallBack에 의해 보유되므로 에 의해 해제되지 않습니다.

참조 순환을 깨는 방법은 __weak을 사용하여 블록에 의해 캡처된 변수를 선언하는 것입니다.
즉,

으아악

VC가 해제되는 문제는 다른 개체가 VC를 보유하지 않는다는 것입니다. 올바른 해결 방법은 현재 NavigationController 또는 다른 vc 스택에서 vc를 찾은 다음 vc를 작동하는 것입니다.

小葫芦

block 속성에 copy를 사용한 다음 __strong __typeof(weaksSelf) StrongSelf = WeakSelf를 추가했는데 코드 논리가 이상합니다

Peter_Zhu

__strong __typeof(&*weaksSelf) StrongSelf = WeakSelf로 블록을 수정하세요

小葫芦

순환 참조 문제를 논하지 말자

으아악

이 문장에 문제가 있습니다. vc가 push되지 않으면 vc.navigationController가 Nil이 되나요? vc.navgationController가 nil이면 vc를 push할 수 있나요?

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿