阅读 MT 文档,我发现释放内存也可以实现 IDisposable .NET 模式。
例如,在扩展 UIViewController (MyViewController) 的自定义类中,我可以覆盖以下方法:
public override void Dispose (bool disposing)
{
if (disposing){
// do some stuff here
}
base.Dispose (disposing)
}
从这点出发,我的两个问题是:
- 除了图像之外,我还必须发布什么类型的元素?
- 我是否必须从 MyViewController 类 (myViewController.Dispose()) 的实例调用 Dispose 方法,或者像 dealloc 方法一样自动调用 Dispose 方法?
提前致谢。问候。
最佳答案
首次使用 MonoTouch IDisposable与 Mono 或 .NET 相同。你在其他地方读到的关于这个主题的内容,在 stackoverflow或 MSDN ... 都适用于此。
对于 MonoTouch,重要的是要记住 NSObject
实现了 IDisposable
,这很有意义,因为它代表了一个本地对象。这意味着从 NSObject
继承的所有内容(monotouch.dll 的很大一部分)都实现了 IDisposable
。
- What type of elements do I have to release in addition to images?
大多数托管 基于 NSObject 的对象实例都很小,但它们可以表示大型 native 对象(GC 只会知道第一个,管理,大小)。
因此最好在可能的情况下处理基于 NSObject 的实例,例如当您将它们用作局部变量时。 using
模式使得在 C# 中这样做很容易。
OTOH 使用您的判断,一个小的 NSString
不会占用太多内存,而其他的可能很大(或未知,例如 NSString GetWebPageContent (NSUrl)
。
- 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/