我们正在为iPhone制作游戏。我们完成了开发并尝试优化游戏以获取内存。我们注意到,当我们在游戏中加载一个特定的MVC时,并没有释放所有分配的内存。(添加了~4-5MB)。如果你继续玩15-20分钟,这会使游戏的内存使用率非常高,并且在给出低内存警告后游戏最终崩溃。
这就是我的关系
1.在游戏中运行静态分析器并修复所有内存泄漏和警告
2.手动检查所有类的dealloc是否被调用。这似乎很好。
3.还尝试在Xcode中运行Allocations工具,但其中的大多数条目都是CFStrings,mallocs和CFNumbers等,但并不能真正说明它们来自哪个类。有没有更好的方法来使用分配工具?
我还有一些与记忆有关的问题
1.我们在游戏中的许多地方使用自动释放对象,而不使用自动释放池。我的理解是自动释放的对象应该在下一个运行循环中释放,并且不应该造成如此大的问题?
2.此外,如果我通过xib文件加载图像,它们是由iOS缓存的。他们也会占用记忆吗?
如何解决内存使用问题。任何帮助,将不胜感激。 谢谢!
答案 0 :(得分:4)
有几点想法:
您使用的是Core Foundation课程吗?确保对于您使用Create
或Copy
拨打CFRelease
或release
的名称的核心基金会呼叫的所有对象(或转让所有权,然后autorelease
或{ {1}} Objective-C对象)。
您是否也使用过乐器中的Leaks工具?我这么认为,但你没有提到它。请参阅仪器用户指南中的Finding Leaks in your App。
您是否通过imageNamed
加载图片?这会缓存图像并且不适合释放它们。使用imageWithContentsOfFile
并手动管理缓存更安全。
我假设您的视图控制器的dealloc
被调用,并且您正在释放与类属性/ ivars关联的所有对象?
你有僵尸开启吗?这对于诊断目的很有用,但在关闭僵尸之前你不会释放内存。
答案 1 :(得分:2)
Rob和Chris说的话,然后这样做:
使用配置的分配工具仅跟踪活动分配并记录引用计数。
在Allocations收集数据时稍微使用您的应用,然后暂停您的应用。
暂停时,通过Live Bytes和#Living排序是最有用的视图。对于利用Foundation集合类的以数据为中心的应用程序,* String,* Dictionary和* Array的某些组合可能是最常见的。
没关系。如果您单击其中任何一个的详细信息,您将获得当前内存中所有实例的长列表。你可以po <addr>
任何一个人看看他们是什么。您还可以滚动列表以查看哪些功能最常用于分配。同样,您可以点击进入任何实例,查看它的分配位置和/或它可能仍然存在的原因。
同样,您可以从概览表开始,按#Living排序,然后向下滚动到其中一个类的第一个实例。如果该类根源 - 保留 - 大量数据,那么消除或优化这是一个很好的开始。
当然,不要忘记heapshot analysis作为内存增长代际分析的极其有效的工具。