我的iPhone应用程序有很多高分辨率的图像(例如:2898×779个像素尺寸),整个项目文件夹的大小只有17MB,但如果我运行应用程序,当第一个视图加载真正的内存和显示在仪器的VM跟踪器中的脏内存超过62MB。任何人都可以帮助我避免这种情况?任何建议都会很感激。如何减少实际内存消耗IOS
回答
影像一旦加载到内存中失去了(大多数?)他们的压力。很不幸,图片在磁盘上可能看起来不大(捆绑在应用程序中),但一旦加载到应用程序中,图片可能会变得更大。在RAM
一个2898x779图像将有效地使用2898x779x4字节=〜9MB,比较,与你的形象有多大的磁盘上,你应该看到其中的差别。
所以要真正回答你的问题,要么缩小你的图像(因为你的设备屏幕可能不是那么大,除非视网膜ipad什么的)或使用CATiledLayer
,它只会加载部分图像可见屏幕,而不是整个图像。
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/blog/lab-mobile/iphone/5-tips-to-reduce-memory-issues-in-ios-apps –
- 1. 减少内存消耗
- 2. jQAssistant - 减少内存消耗
- 3. 如何减少AJDT的内存消耗?
- 4. 如何减少unordered_multiset的内存消耗?
- 5. 在ubuntu @ aws微实例上减少mysql的内存消耗
- 6. 如何加速python脚本并减少内存消耗?
- 7. 如何减少Java程序的内存消耗
- 8. 如何**禁用** Chrome的新尝试来减少内存消耗?
- 9. 如何通过python线程减少内存消耗
- 10. 如何减少.NET应用程序消耗的内存量?
- 11. 如何减少WordPress网站的内存消耗?
- 12. 照片拼贴:如何减少内存消耗?
- 13. 如何减少内存消耗在android系统
- 14. 如何减少与许多单元格PdfPTable的内存消耗
- 15. 如何减少码头集装箱的内存消耗?
- 16. C++:缓存JSON而不是对象减少内存消耗?
- 17. 将单独的实体帮助减少内存消耗? (实体框架)
- 18. Azure MVC5 BundleTransformer减少内存耗尽
- 19. 减少日期核心分配的内存消耗
- 20. 是否可以减少Windows服务的内存消耗?
- 21. 展望VSTO崩溃和减少内存消耗的方法
- 22. 来自BitmapSource的MemoryStream,需要减少内存消耗
- 23. 减少通过WCF服务的内存消耗
- 24. 在Perl中使用多线程时如何减少内存消耗?
- 25. 如何减少Java应用程序服务器中的内存消耗
- 26. C#:如何减少使用位图时的内存和CPU消耗?
- 27. 空CALayer消耗多少内存?
- 28. 以最少内存消耗Resuse ArrayList
- 29. 正在消耗多少内存映射?
- 30. 内存消耗
能否请您分享一些代码,您是如何加载图像或看法? – Iducool
对于您重复参考的图像,请勿加载图像并保留参考。基本上每次需要图像时都要使用'+ imageNamed',并在您不再需要图像时立即释放图像。然后系统会缓存“旧”图像,并会在下一个“imageNamed”请求中返回相同的图像对象(因此它真的很快),但会删除最近未使用的图像。 –