【问题标题】:How can I tell if a referenced object has been deallocated in objective-c?如何判断一个引用的对象是否已在 Objective-c 中被释放?
【发布时间】:2010-06-30 12:11:17
【问题描述】:

升级到 iPhone OS 4.0 后,应用程序在应用程序之间切换后开始崩溃。当应用程序收到内存警告时,应用程序在同一个地方崩溃。

似乎有些对象在收到内存警告时会自动释放,然后当我们尝试使用释放的对象时,应用程序会崩溃。

是否可以测试一个对象是否已被释放,以便我们可以重新分配它们?

【问题讨论】:

标签: iphone objective-c ios4 multitasking didreceivememorywarning


【解决方案1】:

您无法测试特定对象是否已被释放,因为释放后该对象不再存在。您唯一能做的就是测试来自另一个对象对可疑对象的引用是否仍然是非零。

您的问题不是释放本身,而是管理不善的保留。您有一个已被标记为不再使用的对象,系统正在按照系统应有的方式杀死它。您在低内存期间看到它的唯一原因是系统立即停止并耗尽所有释放池,而不是等待正常循环。

您需要确保已正确保留所需的所有对象,以免它们被不当释放。即使在内存不足的情况下,保留的对象也不会被释放。

编辑

我要补充一点,内存不足崩溃的最常见原因是假设视图或视图中的资源始终存在,即使视图未显示也是如此。系统将清除低内存中未显示的视图及其资源(如图像)。检查视图控制器的didReceiveMemoryWarning

【讨论】:

    【解决方案2】:

    你可以添加

    -(void)dealloc { ... }
    

    如果合适的话就留空,并在里面添加断点。

    此答案对ARCNON-ARC 正确

    【讨论】:

      【解决方案3】:
      1. UIViewController 中实现方法 dealloc 以查看它从内存中释放的时刻

        - (void) dealloc

      2. 打印您要测试的任何对象的引用。

        NSLog("Get pointer: %@", self); // ViewController

      然后在要测试对象是否仍然存在的地方设置一个断点。如果遇到断点,请使用

      检查调试器中的对象指针
      `po [pointer_printed_before]
      

      这里可以看到,指针已经不可用了,dealloc方法打印了一个日志后就没有对象了。

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        相关资源
        最近更新 更多