我的 iphone 应用程序有很多高分辨率图像(例如:2898 × 779 像素尺寸),整个项目文件夹的大小只有 17mb,但是如果我运行应用程序并且加载第一个视图时,实际内存和脏内存显示在Instruments 中的 VM Tracker 超过 62mb。谁能帮我避免这种情况?任何建议将不胜感激。
2 回答
图像一旦加载到内存中就会丢失(大部分?)它们的压缩。所以不幸的是,图像在磁盘上(捆绑在应用程序中)时可能看起来并不大,但一旦加载到您的应用程序中,它们可能会大得多。
ram 中的一个 2898x779 图像将有效使用 2898x779x4 字节 = ~9mb,将其与磁盘上的图像大小进行比较,您应该会看到差异。
所以要真正回答你的问题,要么缩小你的图像(因为你的设备屏幕可能不是那么大,除非视网膜 ipad 或其他东西)或者使用CATiledLayer
只会加载屏幕上可见的部分图像,而不是整个图像。
减少 iOS 应用程序内存问题的 5 个技巧
1. 使用虚拟内存 iOS 不使用交换文件,但它支持虚拟内存。如果应用程序在内存中保留大量数据以进行随机访问,您希望将其组织为映射文件,而不是使用 malloc() 将其加载到 RAM。最简单的方法是调用 NSData initWithContentsOfMappedFile:
2.避免堆叠自动释放的对象 当你实例化像NSString这样没有显式分配的对象时,它们会一直存在到你的自动释放池释放——通常直到你的应用程序退出。广泛使用此类技术可能会导致 RAM 中出现大量垃圾。使用 NSString initWithContentsOfFile: 以便您以后可以发布它而不是 NSString stringWithContentsOfFile: 。相同的规则适用于 UIImage imageNamed: – 不建议将其用于图像加载。
3. 处理内存警告处理内存警告 时卸载不必要的资源。即使您无法在所有 UIViewControllers 中卸载任何东西调用 [super didReceiveMemoryWarning]。默认情况下,这将释放一些资源,例如非正面视图上的 UI 控件。未能处理此事件可能会使 iOS 决定您的应用程序应该被杀死。
4. 考虑动画视图转换的有限使用 像翻转转换这样的动画在执行时会导致 RAM 使用高峰。此功能非常简洁,应该在许多情况下使用,但它可能会在负载繁重的多任务环境中触发内存警告。特别是我们强烈建议避免为 OpenGL 视图设置动画。
5. 测试您在设备上的内存占用 使用仪器进行测试。最有用的工具是分配、泄漏和活动监视器。在大多数情况下,在模拟器上进行测试并不相关,因为它的内存占用往往完全不同。测试后,您可以了解应用程序的每个部分使用了多少 RAM、瓶颈在哪里以及如何进行优化。