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

标签 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中的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/

相关文章:

ios - 如何将 UIBlurEffect 与模态视图 Controller 一起使用?

ios - 在 Phonegap 中将网络照片保存到相机胶卷

ios - 无法在 iOS 应用程序中使用 dispatch_source_t 在 GCD block 中运行计时器

c# - 使用反射将委托(delegate)连接到事件?

ios - 试图理解宏的操作顺序

objective-c - iOS 应用程序的方向还记得吗?

iphone - NSTimer 在 iPhone 中关闭应用程序后继续计数

delegates - QML 独特的 TableViewColumn 委托(delegate)

ios - performSelector 可能会导致泄漏,因为它的选择器是未知的 IN Singleton Class/FUNCTION Pointer -Passing Function as parameter

ios - 在 Xcode 的 .plist 中定义 ENUM 值