【发布时间】:2012-04-01 15:43:39
【问题描述】:
我收到了两个内存警告。它不显示警告级别。它显示简短的短语:
Received memory warning.
Received memory warning.
我收到内存警告,几秒钟后我的应用程序崩溃了。我的应用程序是否因为收到内存警告而崩溃?
我知道内存警告级别 2 会杀死自动释放对象。没有任何级别指示的内存警告会杀死自动释放对象吗?
【问题讨论】:
标签: ios memory-management crash
我收到了两个内存警告。它不显示警告级别。它显示简短的短语:
Received memory warning.
Received memory warning.
我收到内存警告,几秒钟后我的应用程序崩溃了。我的应用程序是否因为收到内存警告而崩溃?
我知道内存警告级别 2 会杀死自动释放对象。没有任何级别指示的内存警告会杀死自动释放对象吗?
【问题讨论】:
标签: ios memory-management crash
您在与 MRC 合作吗?在这种情况下,当收到内存警告时,将调用 dealloc 方法来释放所有必要的视图和对象以释放一些内存。
检查是否在 dealloc 中正确释放所有内容。
当您的应用超出其范围时,自动释放对象会自动释放。
【讨论】:
自动释放对象并不总是立即释放
例如...如果您有一个循环,其中分配了很多自动释放对象,则对象在循环结束之前不会被释放...因此,如果它们的大小很大,您可能会收到内存警告和应用程序崩溃在循环结束之前他们有机会被释放
如果是 this .. 自己分配和释放对象来管理内存问题
【讨论】:
使用虚拟内存 iOS 不使用交换文件,但它支持虚拟内存。如果应用程序在内存中保留大量数据以供随机访问(例如 Letter Blocks 3D 中的词汇表),您希望将其组织为映射文件,而不是将其加载到 RAM 中 malloc() .最简单的方法是调用 NSData initWithContentsOfMappedFile:
避免堆叠自动释放的对象 当你实例化像 NSString 这样没有显式分配的对象时,它们会一直存在到你的自动释放池释放——通常直到你的应用退出。此类技术的广泛使用可能会导致 RAM 中出现大量垃圾。采用 NSString initWithContentsOfFile: 所以你可以稍后发布它而不是 NSString stringWithContentsOfFile: .同样的规则适用于 UIImage imageNamed: – 不建议将其用于图像加载。
处理内存警告 处理内存警告时卸载不必要的资源。即使您无法卸载任何东西调用 [super didReceiveMemoryWarning] 在你所有的 UIViewControllers 中。默认情况下,这将释放一些资源,例如非正面视图上的 UI 控件。未能处理此事件可能会使 iOS 决定您的应用应该被杀死。
考虑有限使用动画视图转换 注意到翻转过渡之类的动画在执行时会导致 RAM 使用量激增。此功能非常简洁,应该在许多情况下使用,但它可能会在负载繁重的多任务环境中触发内存警告。特别是我们强烈建议避免为 OpenGL 视图设置动画。
测试您在设备上的内存占用 使用仪器进行测试。最有用的工具是分配、泄漏和活动监视器。在大多数情况下,在模拟器上进行测试并不相关,因为它的内存占用往往完全不同。测试后,您可以了解应用的每个部分使用了多少 RAM、瓶颈在哪里以及如何优化。
发件人:http://surgeworks.com/blog/lab-mobile/iphone/5-tips-to-reduce-memory-issues-in-ios-apps
【讨论】: