我的iPhone应用程序有很多高分辨率的图片(例如:2898×779像素尺寸),整个项目文件夹大小只有17MB,但如果我运行应用程序并加载第一个视图时,在Instruments的VM Tracker中显示的实际内存和脏内存超过62MB。有人可以帮我避免这种情况吗?任何建议将不胜感激。
我的iPhone应用程序有很多高分辨率的图片(例如:2898×779像素尺寸),整个项目文件夹大小只有17MB,但如果我运行应用程序并加载第一个视图时,在Instruments的VM Tracker中显示的实际内存和脏内存超过62MB。有人可以帮我避免这种情况吗?任何建议将不胜感激。
图片一旦加载到内存中就会失去(大部分的)压缩。因此,遗憾的是,这些图片在磁盘上(应用程序中)可能看起来不大,但是一旦加载到您的应用程序中,它们可能会变得更大。
例如,一个 2898x779 像素的图片,在内存中实际上会使用 2898x779x4 字节= ~9mb 的空间,与您在磁盘上看到的图片大小相比,您应该可以看出差别。
因此,要真正回答你的问题,要么减小图片尺寸(因为设备屏幕可能不太大,除非是视网膜 iPad 或类似的设备),要么使用 CATiledLayer
,它只会加载屏幕可见部分的图片,而不是整张图片。
5个减少iOS应用程序内存问题的技巧
1. 使用虚拟内存 iOS不使用交换文件,但支持虚拟内存。如果一个应用程序在内存中保留大量数据以进行随机访问,则需要将其组织为映射文件,而不是使用 malloc() 将其加载到RAM中。最简单的方法是调用 NSData initWithContentsOfMappedFile:
2. 避免堆叠自动释放对象 当您实例化像NSString这样的对象时,如果没有明确的分配,它们会一直存在,直到autorelease池的释放-通常直到您的应用退出。过度使用此类技术可能会导致RAM中有大量垃圾。使用 NSString initWithContentsOfFile: 以便稍后可以释放它,而不是使用 NSString stringWithContentsOfFile: 。相同的规则适用于 UIImage imageNamed: - 不推荐使用此功能进行图像加载。
3. 处理内存警告 处理内存警告时卸载不必要的资源。即使您无法卸载任何内容,请在所有UIViewControllers中调用 [super.didReceiveMemoryWarning] 。这将默认释放一些资源,例如非前视图上的UI控件。未能处理此事件可能会使iOS决定杀死您的应用程序。
4. 考虑有限使用动画视图转换 执行动画转换等动画时,会注意到RAM使用量的峰值。这个功能非常好,应该在许多情况下使用,但在高负载的多任务环境中可能会触发内存警告。特别是我们强烈建议避免对OpenGL视图进行动画处理。
5. 在设备上测试您的内存占用 使用工具测试。最有用的工具是Allocations、Leaks和Activity Monitor。在大多数情况下,在模拟器上测试不相关,因为它的内存占用往往完全不同。一旦您测试,就可以确定您的应用程序的每个部分使用了多少RAM,瓶颈在哪里以及如何进行优化。
+imageNamed
,并在不再需要它们时立即释放图像。然后,系统将缓存“旧”图像,并在下一次请求imageNamed
时为您返回相同的图像对象(因此速度非常快),但会删除长时间未使用的图像。 - Hot Licks