MonoTouch和IDisposable模式

时间:2011-10-08 13:38:55

标签: .net memory-management garbage-collection xamarin.ios idisposable

阅读MT文档,我已经看到可以释放内存并实现IDisposable .NET模式。

例如,在扩展UIViewController(MyViewController)的自定义类中,我可以覆盖以下方法:

public override void Dispose (bool disposing)
{
   if (disposing){
     // do some stuff here
   }
   base.Dispose (disposing)
}

从这一点开始,我的两个问题是:

  1. 除了图像,我还需要发布什么类型的元素?
  2. 我是否必须从MyViewController类的实例(myViewController.Dispose())调用Dispose方法,或者像dealloc方法一样自动调用Dispose方法?
  3. 提前谢谢你。问候。

1 个答案:

答案 0 :(得分:3)

IDisposable的第一个MonoTouch用法与Mono或.NET相同。您在其他地方,stackoverflowMSDN上阅读的有关此主题的内容将全部适用于此处。

重要的是,MonoTouch要记住NSObject实现IDisposable,因为它代表了一个原生对象,所以它很有意义。这意味着继承自NSObject的所有内容( monotouch.dll 的很大一部分)都会实现IDisposable

  
      
  1. 除了图像,我还需要发布什么类型的元素?
  2.   

大多数托管基于NSObject的对象实例很小但它们可以代表大型原生对象( GC 只能知道第一个,管理,大小)。

所以最好尽可能地处理基于NSObject的实例,例如:当你将它们用作局部变量时。 using模式可以在C#中轻松实现。

OTOH使用你的判断,小NSString不会记忆太多,而其他人可能很大(或未知,例如NSString GetWebPageContent (NSUrl)

  
      
  1. 我是否必须从MyViewController类的实例(myViewController.Dispose())调用Dispose方法,或者像dealloc方法一样自动调用Dispose方法?
  2.   

Dispose模式的一部分确保终结器会调用Dispose(如果之前未调用过)。因此, GC 最终将回收与这些实例关联的内存(托管和非托管/本机)。

您可能希望使用某些工具,例如Gendarme(将在OSX上运行)或FxCop(仅限Windows),如果您的某些类型具有IDisposable字段,则会向您报告(例如)没有妥善处理。

免责声明:我是Gendarme的维护者: - )