Memory leaks 有人能告诉我一些在monotouch中调试内存泄漏的策略吗?

Memory leaks 有人能告诉我一些在monotouch中调试内存泄漏的策略吗?,memory-leaks,xamarin.ios,Memory Leaks,Xamarin.ios,我几乎完成了我的第一个monotouch应用程序,几乎就是这样,但是一些内存泄漏的大问题。即使我在每个视图控制器上覆盖viewDidUnload,以便对于我创建的每个UI元素,我首先将其从superview中删除,然后调用Dispose,然后将其设置为null,但问题仍然存在。使用仪器是没有帮助的,它不会检测内存泄漏,内存分配也不会指向我可以跟踪的任何东西 我的应用程序主要使用MPMoviePlayer来播放视频流,还显示通过http加载的图像的图像库。这两种操作都会引起问题 非常感谢您的任何想

我几乎完成了我的第一个monotouch应用程序,几乎就是这样,但是一些内存泄漏的大问题。即使我在每个视图控制器上覆盖viewDidUnload,以便对于我创建的每个UI元素,我首先将其从superview中删除,然后调用Dispose,然后将其设置为null,但问题仍然存在。使用仪器是没有帮助的,它不会检测内存泄漏,内存分配也不会指向我可以跟踪的任何东西

我的应用程序主要使用MPMoviePlayer来播放视频流,还显示通过http加载的图像的图像库。这两种操作都会引起问题


非常感谢您的任何想法。

用户界面元素不太可能是负责任的元素,它们几乎不使用任何内存。调用Dispose()/nulling会有所帮助,但只是一点点


更可能的问题来源是MPMoviePlayer、图像下载和图像渲染等对象。您可能保留了对这些对象的引用,这些对象会阻止GC删除它们。

当然,主控是正确的。格雷西亚斯·米格尔。不过,我想对我所做的做一个更透彻的解释,希望这能对未来的Xamarin学院有所帮助

1) MPMoviePlayer存储一个有点粘的视频缓冲区。我所做的是在AppDelegate上运行一个独特的实例,并在显示视频的视图中重用它。因此,与使用url初始化MPMoviePlayerController不同,您可以使用不带参数的构造函数,然后设置ContentUrl属性并调用Play()

2) 不要依赖调用ViewDidUnload来清理对象,因为它的调用并不一致。例如,我使用了很多模态视图控制器,但这个方法从未被调用。内存一直在积累,直到应用程序崩溃。最好直接打电话给你清理代码

3) 照片是我记忆中最大的拥抱。即使UIImageView中仅用作背景的图像也永远不会被处理。在清除内存之前,我必须在每张图像上专门调用以下代码:

myImageView.RemoveFromSuperview();
myImageView.Image.Dispose();
myImageView.Image = null;
myImageView.Dispose();
myImageView = null;
4) 请注意UIWebView,它会占用大量内存,特别是当您正在加载的页面上运行某种AJAX交互时。调用下面的代码有一点帮助,但并没有解决所有问题。一些内存泄漏仍然存在,我无法消除:

NSString keyStr = new NSString("WebKitCacheModelPreferenceKey");
NSUserDefaults.StandardUserDefaults.SetValueForKey(NSObject.FromObject(val), keyStr);
5) 如果可以,请避免使用Interface Builder。有几次,我无法发布在xib文件上创建的UI元素。手动定位所有内容可能会很痛苦,但如果您使用的是内存密集型应用程序,那么用代码创建所有视图控制器可能是一种方法

6) 使用匿名方法作为事件处理程序很好,我的帮助代码可读性也很好,但在某些情况下,无法手动分离事件处理程序成为一个问题。对不需要的对象的引用仍保留在内存中

7) 在我的UITableViewSource中,通过创建用于独立设置单元格样式的UIImages,然后在我的GetViewForHeader和GetCell方法上重用它们,我能够更高效地处理内存

最后一件事;尽管仪器与monotouch的操作方式并不完全兼容,但使用“内存监视器”是一种很有价值的工具,如果您遇到问题,它确实可以提供帮助

这些策略解决了我的大部分问题。事后看来,有些可能很明显,但我认为把它们传下去不会有什么坏处

iPhone上的快乐编码和c#万岁