如何减少iOS系统实际内存消耗

3

我的iPhone应用程序有很多高分辨率的图片(例如:2898×779像素尺寸),整个项目文件夹大小只有17MB,但如果我运行应用程序并加载第一个视图时,在Instruments的VM Tracker中显示的实际内存和脏内存超过62MB。有人可以帮我避免这种情况吗?任何建议将不胜感激。


请问您能否分享一些代码,展示如何加载图像或视图? - Iducool
对于重复引用的图像,请不要只是加载图像并保留引用。每次需要图像时,基本上都要使用+imageNamed,并在不再需要它们时立即释放图像。然后,系统将缓存“旧”图像,并在下一次请求imageNamed时为您返回相同的图像对象(因此速度非常快),但会删除长时间未使用的图像。 - Hot Licks
2个回答

3

图片一旦加载到内存中就会失去(大部分的)压缩。因此,遗憾的是,这些图片在磁盘上(应用程序中)可能看起来不大,但是一旦加载到您的应用程序中,它们可能会变得更大。

例如,一个 2898x779 像素的图片,在内存中实际上会使用 2898x779x4 字节= ~9mb 的空间,与您在磁盘上看到的图片大小相比,您应该可以看出差别。

因此,要真正回答你的问题,要么减小图片尺寸(因为设备屏幕可能不太大,除非是视网膜 iPad 或类似的设备),要么使用 CATiledLayer,它只会加载屏幕可见部分的图片,而不是整张图片。


我认为这只适用于图像格式为JPEG的情况。如果图像格式为PNG,则它已经是未压缩格式了。 - Iducool
3
PNG文件的确具有压缩功能,但与JPG不同的是,PNG采用无损压缩,而JPG则采用有损压缩。(http://en.wikipedia.org/wiki/Portable_Network_Graphics) - Fonix
这个问题涉及到内存使用,也就是说文件被解压缩到内存中之后。无论磁盘上使用的是PNG还是JPEG压缩,重要的是解压缩后的图像大小取决于图像的宽度和高度,而不是磁盘上使用的PNG或JPEG压缩方法。 - MoDJ

2

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,瓶颈在哪里以及如何进行优化。

来自http://surgeworks.com/


3
也许你应该给予认可:http://surgeworks.com/blog/lab-mobile/iphone/5-tips-to-reduce-memory-issues-in-ios-apps - Hot Licks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接