谁能给我指出一些调试单触点内存泄漏的策略?

问题描述

| 我的第一个monotouch应用程序快要完成了,几乎就是这样,但是对于内存泄漏的一些大问题。即使我在每个视图控制器上覆盖了viewDidUnload,因此对于我创建的每个UI元素,我都首先将其从其超级视图中删除,然后调用dispose,然后将其设置为null,问题仍然存在。使用仪器没有帮助,它无法检测到内存泄漏,并且内存分配也无法将我指向可以跟踪的任何内容。 我的应用程序主要使用MPMoviePlayer播放视频流,并且还显示通过http加载的图像的图像库。两种操作都引起问题。 任何想法将不胜感激,谢谢。     

解决方法

        UI元素不太可能是负责任的元素,那些元素几乎不使用任何内存。调用Dispose()/ nulling会有所帮助,但只有一点点。 该问题最可能的原因是MPMoviePlayer,图像下载和图像渲染之类的对象。您可能会保留对那些对象的引用,这些对象会阻止GC摆脱它们。     ,        师父当然是对的。格拉西亚斯·米格尔(Gracias Miguel)。尽管我想对自己的工作做一个更彻底的解释,希望对以后的Xamarin大学有所帮助。 1)MPMoviePlayer存储了一种粘性的视频缓冲区。我所做的是在AppDelegate上运行了一个唯一实例,可在显示视频的视图之间重用此实例。因此,与其使用URL初始化MPMoviePlayerController,不使用不带参数的构造函数,然后设置ContentUrl属性并调用Play()。 2)不要依靠调用ViewDidUnload来清理对象,因为不会一致地调用它。例如,我使用了很多模态视图控制器,但从未调用过此方法。内存一直在累积,直到应用程序崩溃为止。最好直接致电您清理代码。 3)图像是我最大的记忆拥抱。即使只是用作背景的UIImageViews内部的图像也永远不会被丢弃。在清理内存之前,我必须在每个图像上专门调用以下代码:
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中,通过创建用于独立设置单元格样式的UIImage,然后在我的GetViewForHeader和GetCell方法上重用它们,我能够获得更有效的内存处理。 最后一件事;即使仪器与使用“内存监视器”的单点触控处理方式并不真正兼容,这也是一个有价值的工具,但是如果您遇到问题,它确实可以提供帮助。 这些策略解决了我的大部分问题。有些事在事后看来很明显,但我认为将它们传递下去不会有任何伤害。 iPhone上的快乐编码和C#万岁