好......
我正在iPhone上实现一个简单的OpenGL ES应用程序,最近我在Pinch Media Analytics中添加了这个应用程序.这样做有助于发现内存管理问题,我不完全确定如何处理它.
在一个完美的世界中,我的应用程序 - 在didFinishLoading中加载PNG和.CAF文件将启动,加载它的所有资源,并运行得很好.
但是,如果我的程序崩溃(这是因为我正在集成Pinch Media库)或者如果我运行Safari并打开一堆页面然后启动我的游戏,游戏将崩溃回到菜单,因为它已经没有了记忆.
在我对系统进行硬重置之前,此问题将持续存在.
你上网的默认答案是实现下面列出的didReceiveMemoryWarning方法....
- (void)didReceiveMemoryWarning { // default behavior is to release the view if it doesn't have a superview. // remember to clean up anything outside of this view's scope, such as // data cached in the class instance and other global data. [super didReceiveMemoryWarning]; }
但这并没有真正帮助,因为它是其他程序,而不是我的记忆.我不想发布自己的观点吗?是否有很好的描述如何处理这种情况和/或didReceiveMemoryWarning事件中发生的事情?
欢迎来到没有VM的共享内存池......你可以在这里做很多事情,但有一些事情(这可能是你的错,你可以完全解决它).游戏开发人员经常建议他们的客户在运行之前重新启动,因此如果您真的需要大量内存才能生效,那么您可能需要在同一条船上.
当然,您应该尽量减少自己的内存占用.但是你也应该尽量避免过多的内存碎片.有时问题不在于没有记忆; 没有足够大的块.有时最好使用Mutable并继续修改它而不是生成一个新的不可变对象.对于大型NSStrings来说尤其如此,这可能真的会浪费内存.
请记住,UIImage +imageNamed:
在释放图像后会保留图像,所以如果您不再需要它们,则需要清除它们.在释放它之前将其名称设置为nil以停止缓存.
确保在"仪器"下运行您的应用程序.你可能正在吃比你想象的更多的记忆.
不要忘记自动释放池.如果在单个事件循环中生成大量自动释放的对象,则可能需要定期耗尽池,以免引发内存.内存峰值可能导致具有适度内存要求的程序突然被杀死.