2012-04-01 46 views
0

我收到两条内存警告。它不显示警告级别。它显示简短的短语:我收到内存警告,我的应用程序崩溃。它会杀死autorelease对象吗?

Received memory warning. 
Received memory warning. 

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

我知道内存警告级别2 killes autorelease对象。没有任何级别指示的内存警告是否会终止autorelease对象?

回答

1

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

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

如果这个..just alloc和发行对象自己来管理内存的问题

+0

在ARC,我们无法释放自己,所以我们可以用零来代替释放? – Rajneesh071 2013-05-20 12:23:10

+0

实际上,如果您从ARC中排除文件,您可以自己释放对象。对于类中的其他对象,您可以自己调用autorelease(而不是自动) – skytz 2013-05-21 15:29:15

+0

但我想使用ARC,因此如何在ARC中释放我们的对象, – Rajneesh071 2013-05-22 05:03:15

2

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

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

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

0
  1. 使用虚拟内存 iOS不使用交换文件,但它确实支持虚拟内存。如果应用程序在内存中保留大量数据以进行随机访问(如字母块3D中的词汇表),则需要将其组织为映射文件,而不是将其装载到RAM中,然后使用malloc() 将其加载到RAM中。要做到这一点的最简单的方法是调用 NSData的initWithContentsOfMappedFile:

  2. 不得堆放自动释放对象 当实例像NSString对象与他们住,直到你的自动释放池释放没有明确的分配 - 通常直到你的应用程序退出。广泛使用这些技术可能会导致RAM中出现大量垃圾。使用 NSString initWithContentsOfFile: 因此您可以稍后释放它而不是 NSString stringWithContentsOfFile: 。同样的规则适用于 UIImage imageNamed: - 这不建议用于图像加载。

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

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

  5. 测试设备上的内存占用情况 使用仪器进行测试。最有用的工具是分配,泄漏和活动监视器。在大多数情况下,在模拟器上进行测试并不相关,因为其内存占用情况往往完全不同。一旦你测试你可以找出你的应用程序的每个部分使用多少内存,哪些是瓶颈以及如何优化。

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