gpt4 book ai didi

ios - 内存警告后将 viewDidUnload 发送到已释放的实例

转载 作者:行者123 更新时间:2023-12-01 19:18:56 26 4
gpt4 key购买 nike

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

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

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

  • 我该如何解决这种情况?

    PS:显然我不使用ARC

    最佳答案

    当你设置一个委托(delegate)时,你应该分配它,而不是保留它(因此单元的释放不应该向 TableView Controller 发送释放消息)。

    Delegating objects do not (and should not) retain their delegates. However, clients of delegating objects (applications, usually) are responsible for ensuring that their delegates are around to receive delegation messages. To do this, they may have to retain the delegate in memory-managed code. This precaution applies equally to data sources, notification observers, and targets of action messages. Note that in a garbage-collection environment, the reference to the delegate is strong because the retain-cycle problem does not apply.



    来自 Concepts in Objective-C Programming

    关于ios - 内存警告后将 viewDidUnload 发送到已释放的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11345458/

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