如何判断引用的对象是否已在objective-c中解除分配?

时间:2010-06-30 12:11:17

标签: iphone objective-c ios4 multitasking didreceivememorywarning

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

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

是否可以测试对象是否已被解除分配,以便我们可以重新分配它们?

3 个答案:

答案 0 :(得分:6)

您无法测试是否已取消分配特定对象,因为在取消分配后,该对象不再存在。你唯一能做的就是测试从另一个对象引用可疑对象是否仍然是非零的。

这里的问题不是解除分配,而是保留不当。您有一个已标记为不再使用的对象,系统正在系统应该将其终止。在低内存中看到它的唯一原因是系统立即停止并排出所有释放池,而不是等待正常循环。

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

修改

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

答案 1 :(得分:4)

您可以添加

-(void)dealloc { ... }

如果是正确的话,请将其留空,并在其中添加断点。

此答案更正为ARCNON-ARC

答案 2 :(得分:2)

  1. UIViewController中实现方法dealloc以查看它从内存中释放的时刻

    - (void) dealloc

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

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

  3. 然后在要测试对象是否仍然存在的位置设置断点。如果遇到断点,请使用

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

    enter image description here

    在这里你可以看到,指针不再可用,在dealloc方法打印日志后不再有对象。