1

这会导致C#Xamarin 中的内存泄漏吗?即可以释放 MyViewController 还是它有循环引用,阻止它?

在 MyViewController 中:

this.TableView.Source = new ViewSource(this);


public class ViewSource : UITableViewSource
{
    private readonly MyViewController parentController;

    public ViewSource(MyViewController parentController)
    {
        this.parentController=parentController;
    }
}

根据:

如果 UITableViewController 实例化一个在变量中引用自身的嵌套类,它会收集垃圾吗?这不成问题。但是如果 Source 很弱,那么如果你只有:

this.TableView.Source = new ViewSource();

可以从下一行放出源码吗?无论哪种方式,这似乎都是一个非常危险的 API。

4

1 回答 1

1

其他人可能会说得比我好,但用几句话来说:不要担心你的第二种情况。GC如果托管对象中的循环与其对应对象具有很强的关系,则问题主要发生在 Xamarin.iOS 上obj-C

在您的(第 2 种)情况下,新创建的ViewSource将与生命一样长TableView。我在这里谈论托管对象。TableView不再使用时,Xamarin.iOS将GC标记它,以及ViewSource,它们都将被丢弃。

不幸的是,这是 Xamarin.iOS 的少数泄漏抽象之一,您需要了解一些底层 Obj-C 的知识才能做出设计决策。

于 2013-09-02T09:06:17.477 回答