gpt4 book ai didi

ios - 如何为案例 : Message sent to deallocated instance 设置委托(delegate)

转载 作者:行者123 更新时间:2023-11-28 21:27:14 25 4
gpt4 key购买 nike

当我登录时,我从 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中的delegate声明为(nonatomic,assign)

在 VC2 中,我正在执行下载操作,当它完成时我正在调用

  [self.delegate downloadFinish:self.downloadData];

问题是当下载完成时,VC1 中的 dealloc 被调用,并且它使 VC2 中的委托(delegate)为 nil。所以委托(delegate)为零,[self.delegate downloadFinish:self.downloadData];不起作用。

如果我在 VC1 dealloc 方法中删除 self.VC2.delegate=nil,那么我会得到异常在行:

   [self.delegate downloadFinish:self.downloadData];

发送到解除分配实例的消息:因为 VC1 已解除分配,我无法对其执行任何操作。

处理这种情况的正确方法是什么?

注意:这只会在我再次重做该过程时发生。

案例 1:登录 -> VC1 ->VC2 工作正常,委托(delegate)通知我下载完成

情况 2:VC1 中没有 dealloc 方法:

login -> VC1 -> VC2 -> logout ->login -> VC1 -> VC2 (boom) crash-message sent to deallocated instance

案例 3:在 VC1 中使用 dealloc 并在其中使用 self.VC2.delegate=nil:

login -> VC1 -> VC2 -> logout ->login -> VC1 -> VC2 没有任何反应,因为 delegate 被设置为 nil

我尝试使用 Zombie instrument,但我一点也不明白。我被长长的堆栈跟踪弄糊涂了,看引用计数和保留计数数字时迷路了。如果您需要,我可以在仪器中发布 stacktract。

编辑:

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

当我通过 segue 加载 VC2 时,VC2 委托(delegate)在 viewDidLoad 中不是 nil,但它变成了 nil下载完成,此时我还在VC2中。我想知道是什么让委托(delegate)为零,因为我没有转到另一个 VC。

最佳答案

确保您要么推送一个 VC,呈现一个 VC,要么添加为 childViewController,这样父级就不会被释放。否则,如果您正在使用 tabbar,则需要确保 VC1 永远不会设置为 nil。

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

关于ios - 如何为案例 : Message sent to deallocated instance 设置委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37601347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com