Ios 内存警告后,viewDidUnload发送到解除分配的实例

Ios 内存警告后,viewDidUnload发送到解除分配的实例,ios,uitableview,memory-management,Ios,Uitableview,Memory Management,我遇到了一个非常有趣的情况,不知道如何解决它。我将首先概述我的程序的体系结构。我有一个UITableViewController派生类,它还实现了my委托协议。此表视图中的单元格是自定义单元格,每个单元格都具有委托(表视图控制器)的强(赋值)类型属性。委托处理一些UI操作 为了重现崩溃,我加载表视图,然后导航离开它。通常在这里,表视图将被解除分配,但在我的例子中,单元格仍然保留对它的强引用,因此它保留在内存中。问题是,在此之后,当内存警告到达设备时,我会崩溃。我推断发生了以下情况: 表视图控制

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

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

  • 表视图控制器接收内存警告
  • it将释放所有(可重复使用的)单元
  • 在单元格的dealloc中,我禁用委托属性,因此它们向表视图控制器发送一个释放
  • 当最后一个单元格的属性为nil时,表视图的ref计数达到零,因此它将自行解除锁定
  • 释放单元格后,表视图的didReceiveMemoryWarning的默认实现将继续,但已在解除分配的僵尸对象上
  • 有时,它会在僵尸上调用viewDidUnload,导致应用程序崩溃
我如何解决这种情况


PS:显然,在设置委托时,我不使用ARC,您应该分配它,而不是保留它(因此单元格的释放不应该向表视图控制器发送释放消息)

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


小心使用这些词。。。你应该也不必。如果你知道你在做什么,你可以保留代表…谢谢各位,这确实是正确的方式。但是您能告诉我如何从表视图控制器(tvc)访问单元实例吗?这对于能够在tvc的dealloc中取消单元格的委托是必要的。。也可以在单元格的dealloc方法中将委托设置为nil。我的意思是,在删除表视图控制器之前,我希望将委托属性设置为nil,否则它们将指向已删除的对象。在cellForRowAtIndexPath中:我实际上创建了单元格,需要设置它们的委托。在单元格的dealloc中,它也没有意义,因为在取消单元格的分配后,它显然不会调用其委托。在dealloc方法中将委托设置为nil将起作用。当您解除锁定一个表时,它将首先向所有单元格发送一条解除锁定消息。我说的函数是
-(UITableViewCell*)cellForRowAtIndexPath:(nsindepath*)indepath
,而不是
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(nsindepath*)indepath