.net - MonoTouch 和 IDisposable 模式

标签 .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 方法?

提前致谢。问候。

最佳答案

首次使用 MonoTouch IDisposable与 Mono 或 .NET 相同。你在其他地方读到的关于这个主题的内容,在 stackoverflowMSDN ... 都适用于此。

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

  1. What type of elements do I have to release in addition to images?

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

因此最好在可能的情况下处理基于 NSObject 的实例,例如当您将它们用作局部变量时。 using 模式使得在 C# 中这样做很容易。

OTOH 使用您的判断,一个小的 NSString 不会占用太多内存,而其他的可能很大(或未知,例如 NSString GetWebPageContent (NSUrl)

  1. Do I have to call the Dispose method from an instance of MyViewController class (myViewController.Dispose()) or the Dispose method is called automatically like dealloc method?

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

您可能想使用一些工具,例如 Gendarme (将在 OSX 上运行)或 FxCop(仅限 Windows),如果您的某些类型具有未正确处理的 IDisposable 字段,它将向您报告(例如)。

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

关于.net - MonoTouch 和 IDisposable 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7697174/

相关文章:

c# - Entity Framework Code First - 保存时如何忽略列

c# - 为什么 WebClient.DownloadStringTaskAsync() 会阻塞? - 新的异步 API/语法/CTP

iphone - 自动释放池和内存管理

node.js - Nodejs "closing directory handle on garbage collection"

c# - 为什么我在用户 "Server"垃圾回收时会出现内存泄漏?

c# - 在 ServiceStack 中进行属性级别授权的最佳方式?

c# - 如何高效地逐项比较两个大的 XML 文件?

ios - MKMapView 的内存使用率很高

C++分配内存问题

.net - GC关于外部进程