我收到了内存警告,我的应用程序崩溃了。它会杀死自动释放对象吗?

时间:2012-04-01 15:43:40

标签: ios memory-management crash

我收到了两个内存警告。它没有显示警告级别。它显示了简短的短语:

Received memory warning.
Received memory warning.

我收到了内存警告,几秒钟后我的应用程序崩溃了。我的应用程序崩溃是因为我收到了内存警告吗?

我知道内存警告级别2千克自动释放对象。没有任何级别指示的内存警告是否会终止自动释放对象?

3 个答案:

答案 0 :(得分:2)

你在和MRC合作吗?在这种情况下,当收到内存警告时,将调用dealloc方法来释放所有必要的视图和对象以释放一些内存。

检查dealloc中是否正确释放了所有内容。

当您的应用超出其范围时,会自动释放自动释放对象。

答案 1 :(得分:1)

自动释放对象并不总是立即释放

例如...如果你有一个循环,你分配了很多自动释放对象,对象将不会被释放,直到循环结束...所以如果它们的大小很大,你可以获得内存警告和应用程序崩溃在循环结束之前他们有机会被释放

如果它的..只是自己分配和释放对象来管理内存问题

答案 2 :(得分:0)

  1. 使用虚拟内存 iOS不使用交换文件,但它支持虚拟内存。如果应用程序在内存中保留大量数据以供随机访问(如Letter Blocks 3D中的词汇表),则需要将其组织为mapfile,而不是将其加载到RAM中 的malloc() 。最简单的方法是打电话 NSData initWithContentsOfMappedFile:

  2. 避免堆叠自动释放的对象 当您实例化NSString之类的对象而没有明确分配时,它们会一直存在,直到您的自动释放池发布 - 通常直到您的应用程序退出。大量使用这些技术可能会导致RAM中出现大量垃圾。使用 NSString initWithContentsOfFile: 所以你可以稍后发布它而不是 NSString stringWithContentsOfFile: 。同样的规则适用于 UIImage imageNamed: - 建议不要将其用于图像加载。

  3. 处理内存警告 处理内存警告时卸载不必要的资源。即使你无法卸载任何你的东西电话 [super didReceiveMemoryWarning] 在你所有的UIViewControllers中。这将默认释放一些资源,如非前视图上的UI控件。未能处理此事件可能会使iOS确定您的应用程序值得查杀。

  4. 考虑限制使用动画视图过渡 注意到翻转过渡等动画会在执行时导致RAM使用率激增。此功能非常简洁,应该在许多情况下使用,但它可能会在负载很重的多任务环境中触发内存警告。特别是我们强烈建议避免动画OpenGL视图。

  5. 测试设备上的内存占用量 使用仪器进行测试。最有用的工具是Allocations,Leaks和Activity Monitor。在大多数情况下,模拟器上的测试不相关,因为它的内存占用量往往完全不同。测试后,您可以计算出应用程序每个部分使用的RAM量,瓶颈在哪里以及如何优化。

  6. 来自:http://surgeworks.com/blog/lab-mobile/iphone/5-tips-to-reduce-memory-issues-in-ios-apps