首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone内存管理didReceiveMemoryWarning

iPhone内存管理didReceiveMemoryWarning
EN

Stack Overflow用户
提问于 2009-05-28 15:09:41
回答 3查看 11.4K关注 0票数 3

好的......

我正在iPhone上实现一个简单的OpenGL ES应用程序,最近我在Pinch Media Analytics中添加了这个应用程序。这样做有助于发现一个内存管理问题,我不完全确定如何处理它。

在一个完美的世界里,我的应用程序-在didFinishLoading中加载PNG和.CAF文件-将启动,加载它的所有资源,并且运行得很好。

但是,如果我的程序崩溃(这发生在我集成Pinch Media库时),或者如果我运行Safari并打开一堆页面,然后启动我的游戏,游戏将崩溃回到菜单,因为它的内存不足。

这个问题将一直存在,直到我对系统进行硬重置。

你上网的默认答案是实现didReceiveMemoryWarning方法,如下所示……

代码语言:javascript
复制
- (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事件中会发生什么,有没有很好的描述?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-28 15:58:44

如果你只有一个视图,那么你唯一能做的就是释放你不使用的数据,并在以后延迟加载它们。

如果您有多个视图,则如果它们不可见,则可能会释放它们。如果发生这种情况,则会向相应的控制器发送带有nilsetView:。我通过立即释放所有IBOutlet变量来处理这种情况,以便在再次从视图的xib加载视图时正确设置它们。

这是我在一个普通的,非OpenGL ES应用程序中采用的方法,它有超过6个视图,即使当我在导航视图中处于4级深度并且所有以前的控制器都将其视图设置为nil时,它也可以一致地工作--当我向后导航时没有崩溃,尽管在视图重新加载时会有延迟。

如果您还没有找到它,在模拟器中有一个菜单项来模拟内存警告,这比在真实设备中强制条件发生更容易。也就是说,它不会取代在真实设备中测试相同的场景-只是让测试变得更容易。

票数 2
EN

Stack Overflow用户

发布于 2009-05-28 16:15:50

欢迎使用没有虚拟机的共享内存池...这里您可以做的不多,但是有一些事情(也有可能实际上是您的错误,您可以完全修复它)。出于这个原因,游戏开发人员经常建议他们的客户在运行它们之前重新启动,所以如果您确实需要大量内存才能有效运行,那么您可能需要处于相同的境地。

当然,您应该尽量减少自己的内存占用。但是你也应该尽量避免过多的内存碎片。有时问题不是没有内存,而是没有足够大的块。有时,使用可变对象并不断修改它比生成新的不可变对象更好。对于大型NSStrings尤其如此,它确实会使内存成为垃圾。

请记住,在您发布图像后,UIImage +imageNamed:将保留该图像,因此如果您不再需要它们,则需要将其清除。将其名称设置为nil,然后释放它以停止缓存。

确保在Instruments下运行您的应用程序。你可能比你想象的要消耗更多的内存。

别忘了自动释放池。如果您在单个事件循环中生成大量自动释放的对象,则可能需要定期清空您的池,以便不会占用大量内存。内存峰值可能会导致内存需求不高的程序突然被终止。

票数 5
EN

Stack Overflow用户

发布于 2009-05-29 01:58:39

您可以尝试使用压缩的PVRTC而不是PNG,以节省一些空间(以可能的性能为代价)。

这里有一个很好的小教程:

http://iphonedevelopment.blogspot.com/2008/12/preparations-for-porting-nehe-lesson-06.html

请记住,您必须重写一些OpenGL调用来处理这种不同的压缩纹理。

免责声明:我不是OpenGL ES优化专家。一点也不像。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/921360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档