代码如下,在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
没有了持有者了,也是被释放了。
所以,请问有什么方法可以解决这个吗?
순환 참조인지는 호출 방법과는 관계 없고 참조 관계에만 관련됩니다.
귀하의 예에서 참조 루프는 vc --> mainModel --> ("-->"는 참조 관계를 나타냅니다)
해제할 객체의 전제 조건은 해당 객체가 다른 객체에 의해 보유되지 않는다는 것입니다. 귀하의 예에서 vc는 netRequestCallBack에 의해 보유되므로 에 의해 해제되지 않습니다.
참조 순환을 깨는 방법은 __weak을 사용하여 블록에 의해 캡처된 변수를 선언하는 것입니다.
으아악즉,
VC가 해제되는 문제는 다른 개체가 VC를 보유하지 않는다는 것입니다. 올바른 해결 방법은 현재 NavigationController 또는 다른 vc 스택에서 vc를 찾은 다음 vc를 작동하는 것입니다.
block 속성에 copy를 사용한 다음 __strong __typeof(weaksSelf) StrongSelf = WeakSelf를 추가했는데 코드 논리가 이상합니다
__strong __typeof(&*weaksSelf) StrongSelf = WeakSelf로 블록을 수정하세요
순환 참조 문제를 논하지 말자
으아악이 문장에 문제가 있습니다. vc가 push되지 않으면 vc.navigationController가 Nil이 되나요? vc.navgationController가 nil이면 vc를 push할 수 있나요?