循环参考/保留循环

时间:2019-01-22 08:36:27

标签: c# ios xamarin.ios

我来自Objective-c / Swift背景,现在在Xamarin.iOS中工作。我在理解循环引用时有些困惑(iOS env中的保留周期)。

这是我正在处理的代码。

public interface IHomeMoreTableViewSourceDelegate
{
    void RowSelected(int row);
}

public class HomeMoreTableViewSource: UITableViewSource
{
    public IHomeMoreTableViewSourceDelegate vDelegate;
}

ViewController代码:

public override void ViewDidLoad() 
{
    HomeMoreTableViewSource source = new HomeMoreTableViewSource
    {
        vDelegate = this
    };
    MoreTableView.Source = source;
}

在Objective-C / Swift中,这将导致保留周期,而打破保留周期的方法是在委托变量声明之前添加关键字weak

在C#中它还会成为特定参考吗?如果是这样,如何打破呢?我看到了WeakReference,但没有多大意义。

1 个答案:

答案 0 :(得分:2)

一个对象引用另一个对象而又引用第一个对象是绝对好的。就像父亲认识自己的孩子一样,每个孩子当然都知道自己的父亲。在这个比喻中,您有一个从父亲到孩子的参考,也有一个到父亲的参考。

class Father
{
    public List<Child> Children { get; } = new List<Child>();
}
class Child
{
    public Father Father { get; set; }
}

现在您可以将多个孩子分配给您的父亲:

var father = new Father();
father.Children.Add(new Child { Father = father });

实际上,您甚至可以拥有一个引用自身的类:

class MyClass
{
    public MyClass TheInstance => this;
}

尽管这对于单例更有意义,在单例中您要确保始终只有一个类的实例。在这种情况下,TheInstance将是static属性。

弱引用顺便说一句。完全不同。