【问题标题】:iphone app crashed when popViewContrller method is called调用pop View Controller方法时iphone应用程序崩溃
【发布时间】:2012-10-01 17:10:53
【问题描述】:

我的应用程序(arc,ios5)有时会在我拍照并保存到CoreData 后崩溃。使用Instruments发现crash前有内存警告,于是尝试了解内存是如何使用的。

我的应用程序在 CoreData 中存储行程(总共 200MB),每次行程有数百个 CLLocation 对象和数十个 UIImage 对象。

每次我通过pushViewController查看一次行程详情,内存使用量都会增加;但是在我 popViewController 之后,内存使用量仍然存在。

我认为有几个嫌疑人:

  1. CoreData 缓存,但我不知道如何清除它;
  2. 详细视图控制器,因为我没有看到在每个 popViewController 之后调用任何 viewDidUnload

经过一些测试,我很困惑,即使我手动调用 viewDidUnload,内存使用量仍然存在。

我还在 ios5.0 模拟器中为我的应用测试了内存泄漏工具,它很干净。

【问题讨论】:

    标签: objective-c ios core-data memory


    【解决方案1】:

    由于内存问题,不建议将图像存储在 coredata 中。检查您是否可以将其存储在文件夹中,并将图像名称/路径存储在您的核心数据中。大多数情况下应该可以解决内存问题。

    这里有一些关于这个CoreData (for iphone) storing imagesCore Data - Storing Images (iPhone)的帖子

    【讨论】:

    • 感谢您的回复。我测试“nil”所有图像,并且内存使用量按预期增长缓慢。但我的问题仍然存在:我怎样才能释放未使用的内存,让应用程序在长时间运行后不会收到内存警告?再次感谢!
    • 您可能需要手动处理。例如,当您通过点击按钮移动到新视图时,您可以编写代码以释放在前一个视图中使用的不需要的对象。每当用户回来时,再次加载这些东西。如果是图像,请将其保存到光盘并在用户尝试恢复时重新加载。这是处理这些问题的一种方法。
    • 谢谢,我现在正在修改 CoreData 以将图像存储到文件系统。我希望它会起作用。
    • 好吧,我已经通过将所有图像移动到文件系统,并使用 NSCache 来缓存图像对象解决了这个问题。现在我的应用程序使用的内存限制在 60 MB,并且不会因内存警告而崩溃。非常感谢!
    【解决方案2】:

    首先,不要使用核心数据来存储图像数据。在 iOS 5 及更高版本上,您可以在属性的文件检查器上将属性检查为“允许外部存储”。您还可以将图像保存在文档目录中,并使用核心数据保存图像的路径。将这些图像呈现给界面时,将它们缓存在 NSCache 上,以便在内存警告开始弹出时清除这些图像。更改管理这些图像的方法将对内存不足警告期间的内存响应产生重大影响。

    【讨论】:

    • 感谢您的帮助,我将图像存储到文件系统后尝试使用 NSCache。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-06-20
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多