1

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

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

  • 表视图控制器收到内存警告
  • 它会释放所有(可重复使用的)细胞
  • 在单元格的 dealloc 中,我 nil 委托属性,因此它们向表视图控制器发送释放。
  • 当最后一个单元格的属性为零时,表格视图的引用计数达到零,因此它将自行释放
  • 释放单元格后,表视图的 didReceiveMemoryWarning 的默认实现继续,但已经在一个已释放的僵尸对象上
  • 有时稍后它会在僵尸上调用 viewDidUnload 并使应用程序崩溃。

我该如何解决这种情况?

PS:显然我不使用ARC

4

1 回答 1

3

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

委托对象不(也不应该)保留它们的委托。但是,委托对象(通常是应用程序)的客户负责确保他们的委托人在附近以接收委托消息。为此,他们可能必须在内存管理代码中保留委托。这种预防措施同样适用于数据源、通知观察者和行动消息的目标。请注意,在垃圾收集环境中,对委托的引用是强的,因为保留周期问题不适用。

来自Objective-C 编程中的概念

于 2012-07-05T13:40:23.377 回答