viewDidUnload在内存警告后发送到deallocated实例

时间:2012-07-05 13:34:21

标签: ios uitableview memory-management

我遇到了一个非常有趣的情况,不知道如何解决它。我将首先概述我的程序的架构。我有一个UITableViewController派生类,它也实现了我的委托协议。此表视图中的单元格是自定义单元格,并且每个单元格都具有委托(表格视图控制器)的强(赋值)类型属性。委托处理一些UI动作。

要重现崩溃,我会加载表视图,然后离开它。通常这里表视图将被释放,但在我的情况下,单元格仍然保持对它的强引用,因此它保留在内存中。问题是,在此之后内存警告到达设备时,我遇到了崩溃。我扣除了以下情况:

  • 表视图控制器收到内存警告
  • 它释放所有(可重复使用的)单元格
  • 在单元格的dealloc中我没有委托属性,因此它们向表视图控制器发送一个版本。
  • 当最后一个单元格nils其属性时,表格视图的引用计数达到零,因此它将自动解除隐私
  • 释放单元格后,表视图的didReceiveMemoryWarning的默认实现仍在继续,但已经在dealloced,zombie对象上
  • 有时候它会在僵尸上调用viewDidUnload并且它会崩溃应用程序。

我该如何解决这种情况?

PS:显然我不使用ARC

1 个答案:

答案 0 :(得分:3)

当您设置委托时,您应该分配它,而不是保留它(因此单元格的释放不应该向表视图控制器发送释放消息)。

  

委派对象不会(也不应该)保留其委托。   但是,委托对象(通常是应用程序)的客户端是   负责确保他们的代表即将接收   授权消息。为此,他们可能必须保留代表   在内存管理的代码中。此预防措施同样适用于数据   来源,通知观察员和行动目标消息。注意   在垃圾收集环境中,引用   委托很有力,因为保留周期问题不适用。

来自Concepts in Objective-C Programming