Xamarin内存回收问题

时间:2014-03-27 13:05:24

标签: c# memory xamarin memory-management xamarin.ios

我已经使用了Xamarin一段时间了,我遇到了一个非常奇怪的问题。

我能够崩溃一个非常简单的两个屏幕应用程序。在第一个屏幕上,我有UIButtonTouchUpInside事件。在第二个,我有一个UIImageView附加图像(来自本地文件)。

我所要做的就是始终在这两个视图控制器之间前后移动。

当我使用活动监视器连接XCode的乐器时,我注意到我的简单应用程序在内存被回收之前达到~100MB的内存,然后它的使用量下降到~15MB。

但是当我循环导航足够长时,内存超过140MB并且应用程序崩溃。我在处理更复杂的应用程序时发现了这种行为。当然,我正在采取所有可用的预防措施:

  • 取消订阅ViewWillDisappear上的活动
  • 将代理人归零等等。

基本上,在我的复杂应用中,我已经覆盖了所有Dispose基类中的UIViewControllers方法,我可以看到使用{{1}调用Dispose方法在显示的每个视图控制器上。但是,内存使用量不会下降。

它出了什么问题?

我想指出一些事情:

  • 我的Xamarin Studio是最新的,
  • 我在iPhone 3GS iOS 6.1.3上以调试模式测试应用程序时出现崩溃
  • 在简单的应用程序中,图像是1024x1024 JPG文件。

这里有一些代码示例:

disposing == false

1 个答案:

答案 0 :(得分:3)

您正在创建按钮/图像的实例并将其存储在后备字段中,并且您未在控制器的Dispose中调用Dispose。 Controller实例化它们,因此你必须清除它们。

在上面的示例中,您也没有取消按钮TouchUpInside事件。我建议不要使用lambda,实际上为它创建一个方法,以便以后更容易分离。

TouchUpInside -= this.Method; 

此外,您不是要从添加它的视图中删除图像。

我知道你说你在视图中做这些事情,它会消失,但这不会发生在你的示例代码中。你能提供一个完整的例子来处理这些基础知识吗?