当我登录时,我通过VC1中的segue调用VC2
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([[segue identifier] isEqualToString: @"embeddedVC2"]) {
self.VC2 = [segue destinationViewController];
self.VC2.delegate = self;
}
}
我在VC1中有dealloc
-(void)dealloc{
self.VC2.delegate=nil;
}
VC2中的委托声明为(非原子,分配)
在VC2中,我正在执行下载操作,当它完成后我正在调用
[self.delegate downloadFinish:self.downloadData];
问题是,当下载完成时,VC1中的dealloc被调用,并且它使VC2中的委托成为零。所以委托是零,[self.delegate downloadFinish:self.downloadData];不起作用。
如果我删除了VC1 self.VC2.delegate=nil
方法中的dealloc
,那么我会得到异常
在这一行:
[self.delegate downloadFinish:self.downloadData];
消息发送到解除分配的实例:因为VC1已取消分配,我无法对其执行任何操作。
处理这种情况的正确方法是什么?
注意:只有当我重新重做该过程时才会发生这种情况。
案例1 :登录 - > VC1 - > VC2工作正常,委托通知我下载完成
案例2 : VC1中没有dealloc方法:
登录 - > VC1 - > VC2 - >注销 - >登录 - > VC1 - >发送到解除分配的实例的VC2(繁荣)崩溃消息
案例3 : VC1中的dealloc和其中的self.VC2.delegate = nil:
登录 - > VC1 - > VC2 - >注销 - >登录 - > VC1 - > VC2没有任何反应,因为委托设置为nil
我尝试过使用Zombie乐器,但我没有理解。我对长堆栈跟踪感到困惑,并且在查看引用计数并保留计数数字时丢失了。如果需要,我可以在工具中发布叠加。
修改
我将委托更改为nonatomic
和weak
并删除了dealloc
方法。
当我通过segue加载VC2
时,viewDidLoad
中的VC2委托不是nil,但是在下载完成时它转为nil
,此时我还在VC2。我想知道是什么让代表无所事事,因为我没有转移到另一个VC。
答案 0 :(得分:2)
确保您推送VC,呈现VC或添加为childViewController,这样父级就不会被解除分配。否则,如果您使用tabbar,则需要确保VC1永远不会设置为nil。
如果您花费太多时间尝试解决问题,我会重写您将VC添加到层次结构中的方式。