【发布时间】:2010-06-30 12:11:17
【问题描述】:
升级到 iPhone OS 4.0 后,应用程序在应用程序之间切换后开始崩溃。当应用程序收到内存警告时,应用程序在同一个地方崩溃。
似乎有些对象在收到内存警告时会自动释放,然后当我们尝试使用释放的对象时,应用程序会崩溃。
是否可以测试一个对象是否已被释放,以便我们可以重新分配它们?
【问题讨论】:
标签: iphone objective-c ios4 multitasking didreceivememorywarning
升级到 iPhone OS 4.0 后,应用程序在应用程序之间切换后开始崩溃。当应用程序收到内存警告时,应用程序在同一个地方崩溃。
似乎有些对象在收到内存警告时会自动释放,然后当我们尝试使用释放的对象时,应用程序会崩溃。
是否可以测试一个对象是否已被释放,以便我们可以重新分配它们?
【问题讨论】:
标签: iphone objective-c ios4 multitasking didreceivememorywarning
您无法测试特定对象是否已被释放,因为释放后该对象不再存在。您唯一能做的就是测试来自另一个对象对可疑对象的引用是否仍然是非零。
您的问题不是释放本身,而是管理不善的保留。您有一个已被标记为不再使用的对象,系统正在按照系统应有的方式杀死它。您在低内存期间看到它的唯一原因是系统立即停止并耗尽所有释放池,而不是等待正常循环。
您需要确保已正确保留所需的所有对象,以免它们被不当释放。即使在内存不足的情况下,保留的对象也不会被释放。
我要补充一点,内存不足崩溃的最常见原因是假设视图或视图中的资源始终存在,即使视图未显示也是如此。系统将清除低内存中未显示的视图及其资源(如图像)。检查视图控制器的didReceiveMemoryWarning。
【讨论】:
你可以添加
-(void)dealloc { ... }
如果合适的话就留空,并在里面添加断点。
此答案对ARC 和NON-ARC 正确
【讨论】: