如何为case设置委托:将消息发送到解除分配的实例

时间:2016-06-02 20:17:45

标签: ios objective-c delegates

当我登录时,我通过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乐器,但我没有理解。我对长堆栈跟踪感到困惑,并且在查看引用计数并保留计数数字时丢失了。如果需要,我可以在工具中发布叠加。

修改

我将委托更改为nonatomicweak并删除了dealloc方法。

当我通过segue加载VC2时,viewDidLoad中的VC2委托不是nil,但是在下载完成时它转为nil,此时我还在VC2。我想知道是什么让代表无所事事,因为我没有转移到另一个VC。

1 个答案:

答案 0 :(得分:2)

确保您推送VC,呈现VC或添加为childViewController,这样父级就不会被解除分配。否则,如果您使用tabbar,则需要确保VC1永远不会设置为nil。

如果您花费太多时间尝试解决问题,我会重写您将VC添加到层次结构中的方式。