【问题标题】:MonoTouch: proper way to handle ReceiveMemoryWarningMonoTouch:处理 ReceiveMemoryWarning 的正确方法
【发布时间】:2011-04-11 15:04:14
【问题描述】:

我有一个 MonoTouch 应用程序,它有时会因 mprotect errno 12 (out of memory) 而死,而且它似乎总是事先至少收到一个 ReceiveMemoryWarning 通知。

我想知道如何正确回应这个问题。我的应用可以释放两种类型的东西:OpenGL 纹理和托管内存。

我的问题是:

  1. OpenGL 纹理:删除 OpenGL 纹理会有帮助吗?

  2. 托管内存:我无法直接释放它,但我可以获得对它的空引用。够了吗?

  3. GC.Collect:我应该在处理程序结束时调用 GC.Collect() 吗? GC.Collect 是立即执行任何操作,还是为将来安排收集?

  4. 对此我还能/应该做些什么?

【问题讨论】:

  • 确定不泄露吗?
  • 据我所知,它没有泄漏。我正在跟踪所有 OpenGL 纹理分配和声音数据(管理——我们有自己的混音器),这是我们使用的最大内存位。我已经大大减少了这些东西使用的内存量(我们徘徊在 7MB 纹理内存和 2MB 声音数据左右),但有时由于内存不足,它仍然会死机,尤其是在使用 .NET WebRequest API、iOS 图像之后选择器,或者 MFMailComposer 的东西。
  • 确保释放在 WebRequest 中使用的对象,因为它们可以在内存中保留大缓冲区的时间超过您需要的时间(即,在 GC 有机会运行之前)

标签: xamarin.ios


【解决方案1】:

我在使用 OpenGL 的应用程序中遇到了这个问题。对我来说,这确实是内存泄漏。

[DllImport("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics")] public static extern void CGDataProviderRelease(IntPtr provider);

在你打电话之后 GL.TexImage2D.....

你需要调用CGDataProviderRelease(data.Handle);

既然这么说,你可能想看看这个:

http://forums.monotouch.net/yaf_postst1541.aspx

【讨论】:

  • 谢谢丹尼。在您的情况下,Instruments 中是否出现了内存泄漏(或者您是否看到内存使用量在增加)?我没有在任何地方(至少直接)在我的代码中使用 CGDataProvider,而且在我的应用程序死亡之前,我没有看到 Instruments 中的应用程序内存在增加。
  • 我花了一些时间来隔离这种情况,并将结果总结在new question here中。
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 2010-12-08
  • 2011-02-28
  • 2016-01-15
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多