2013-06-26 56 views
3

我的iPhone应用程序有很多高分辨率的图像(例如:2898×779个像素尺寸),整个项目文件夹的大小只有17MB,但如果我运行应用程序,当第一个视图加载真正的内存和显示在仪器的VM跟踪器中的脏内存超过62MB。任何人都可以帮助我避免这种情况?任何建议都会很感激。如何减少实际内存消耗IOS

+0

能否请您分享一些代码,您是如何加载图像或看法? – Iducool

+0

对于您重复参考的图像,请勿加载图像并保留参考。基本上每次需要图像时都要使用'+ imageNamed',并在您不再需要图像时立即释放图像。然后系统会缓存“旧”图像,并会在下一个“imageNamed”请求中返回相同的图像对象(因此它真的很快),但会删除最近未使用的图像。 –

回答

3

影像一旦加载到内存中失去了(大多数?)他们的压力。很不幸,图片在磁盘上可能看起来不大(捆绑在应用程序中),但一旦加载到应用程序中,图片可能会变得更大。在RAM

一个2898x779图像将有效地使用2898x779x4字节=〜9MB,比较,与你的形象有多大的磁盘上,你应该看到其中的差别。

所以要真正回答你的问题,要么缩小你的图像(因为你的设备屏幕可能不是那么大,除非视网膜ipad什么的)或使用CATiledLayer,它只会加载部分图像可见屏幕,而不是整个图像。

+0

我认为只有当图像是JPEG格式时才是如此。如果图像的PNG格式比它已经是未压缩的格式。 – Iducool

+3

PNG的确有压缩,它只是与jpg有损压缩相比的无损压缩(http://en.wikipedia.org/wiki/Portable_Network_Graphics) – Fonix

+0

问题是关于内存使用,这意味着在文件解压缩到内存之后。在磁盘上使用PNG或JPEG压缩并不重要,重要的是解压缩的图像有多大,取决于图像的宽度和高度,而不是磁盘上的PNG或JPEG压缩方法。 – MoDJ

2

5个技巧,以减少内存的iOS应用程式问题

1.使用虚拟内存 iOS不使用交换文件,但是它支持虚拟内存。如果一个应用程序可以使大量的数据在内存中的随机访问你想组织它的映射文件而不是加载它与 的malloc() RAM。要做到这一点的最简单的方法是调用 NSData的initWithContentsOfMappedFile:

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

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

4.考虑动画视图过渡 动画像翻动过渡是注意到当被执行时引起RAM使用尖峰有限的使用。此功能非常整洁,应该在许多情况下使用,但可能会在重负载的多任务环境中触发内存警告。特别是我们强烈建议避免OpenGL视图的动画。

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

http://surgeworks.com/

+3

也许你应该给信贷:http://surgeworks.com/blog/lab-mobile/iphone/5-tips-to-reduce-memory-issues-in-ios-apps –

相关问题