Monotouch中与dealloc相对应的是什么?

6

我正在查看一个包含以下objective-c代码的在线示例

    -(void)dealloc {
    [activeController viewWillDisappear:NO];
    [activeController.view removeFromSuperview];
    [activeController viewDidDisappear:NO];

    [activeController release];
    [super dealloc];
}

我假设MT的等效操作是Dispose,我正确吗?
我不需要调用:
    [activeController release];
    [super dealloc];

由于Monotouch会进行垃圾回收,因此这些方法也会被回收,这个说法正确吗?

4个回答

14

MonoTouch是带有垃圾回收机制的,因此您不需要担心自己进行内存释放。

尽管如此,在某些情况下,您可能知道自己在保留一些大型资源,并且希望通过立即处理这些资源来帮助系统,而不是等待垃圾回收器启动。

这就是调用Dispose方法非常方便的时候:它会在垃圾回收器运行之前释放相关的资源。这对于像图像这样的大型对象特别重要,因为图像存储在非托管堆上,而对象引用存储在托管堆上。

这意味着,如果您有一个8兆字节的图像:8兆字节存储在非托管堆中(由Objective-C管理),而1个指针(4字节)存储在托管堆中。就Mono的垃圾回收器而言,您使用了4字节,而不是8兆字节。

所以当您知道一个看似无害的“myImage”变量实际上指向一个大块内存时,这就是调用Dispose方法帮助系统的时候。


1
非常有趣的内容!我有一个问题,请问“由于图像存储在未托管堆上,而对象引用存储在托管堆上”是什么意思?您能解释一下为什么图像要插入未托管堆吗?谢谢。 - Lorenzo B

1

Monotouch是垃圾回收的。在对象被垃圾回收之前,会调用对象的析构函数。

这里是Microsoft关于C#析构函数的页面。我不知道是否有更多关于Monotouch析构函数的相关文档。


1

无需调用释放或dealloc,它们由MonoTouch处理。


0

来自 Xamarin 文档

http://docs.xamarin.com/ios/advanced_topics/api_design#When_to_call_Dispose

当您需要Mono摆脱对象时,应调用Dispose。可能的用例是当Mono不知道您的NSObject实际上持有对重要资源(如内存或信息池)的引用时。在这些情况下,您应该调用Dispose以立即释放对内存的引用,而不是等待Mono执行垃圾回收周期。
在内部,当Mono从C#字符串创建NSString引用时,它会立即处理它们以减少垃圾收集器所需的工作量。周围的对象越少,GC运行得越快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接