减少iPhone应用程序的内存使用量

时间:2013-01-21 20:13:10

标签: ios objective-c xcode interface-builder instruments

我们正在为iPhone制作游戏。我们完成了开发并尝试优化游戏以获取内存。我们注意到,当我们在游戏中加载一个特定的MVC时,并没有释放所有分配的内存。(添加了~4-5MB)。如果你继续玩15-20分钟,这会使游戏的内存使用率非常高,并且在给出低内存警告后游戏最终崩溃。

这就是我的关系
1.在游戏中运行静态分析器并修复所有内存泄漏和警告 2.手动检查所有类的dealloc是否被调用。这似乎很好。
3.还尝试在Xcode中运行Allocations工具,但其中的大多数条目都是CFStrings,mallocs和CFNumbers等,但并不能真正说明它们来自哪个类。有没有更好的方法来使用分配工具?

我还有一些与记忆有关的问题
1.我们在游戏中的许多地方使用自动释放对象,而不使用自动释放池。我的理解是自动释放的对象应该在下一个运行循环中释放,并且不应该造成如此大的问题? 2.此外,如果我通过xib文件加载图像,它们是由iOS缓存的。他们也会占用记忆吗?

如何解决内存使用问题。任何帮助,将不胜感激。 谢谢!

2 个答案:

答案 0 :(得分:4)

有几点想法:

  1. 您使用的是Core Foundation课程吗?确保对于您使用CreateCopy拨打CFReleaserelease的名称的核心基金会呼叫的所有对象(或转让所有权,然后autorelease或{ {1}} Objective-C对象)。

  2. 您是否也使用过乐器中的Leaks工具?我这么认为,但你没有提到它。请参阅仪器用户指南中的Finding Leaks in your App

  3. 您是否通过imageNamed加载图片?这会缓存图像并且不适合释放它们。使用imageWithContentsOfFile并手动管理缓存更安全。

  4. 我假设您的视图控制器的dealloc被调用,并且您正在释放与类属性/ ivars关联的所有对象?

  5. 你有僵尸开启吗?这对于诊断目的很有用,但在关闭僵尸之前你不会释放内存。

答案 1 :(得分:2)

Rob和Chris说的话,然后这样做:

使用配置的分配工具仅跟踪活动分配并记录引用计数。

在Allocations收集数据时稍微使用您的应用,然后暂停您的应用。

暂停时,通过Live Bytes和#Living排序是最有用的视图。对于利用Foundation集合类的以数据为中心的应用程序,* String,* Dictionary和* Array的某些组合可能是最常见的。

没关系。如果您单击其中任何一个的详细信息,您将获得当前内存中所有实例的长列表。你可以po <addr>任何一个人看看他们是什么。您还可以滚动列表以查看哪些功能最常用于分配。同样,您可以点击进入任何实例,查看它的分配位置和/或它可能仍然存在的原因。

同样,您可以从概览表开始,按#Living排序,然后向下滚动到其中一个类的第一个实例。如果该类根源 - 保留 - 大量数据,那么消除或优化这是一个很好的开始。

当然,不要忘记heapshot analysis作为内存增长代际分析的极其有效的工具。