首页 > 解决方案 > 循环参考/保留周期

问题描述

我来自 Objective-c/Swift 背景,现在在 Xamarin.iOS 工作。我对循环引用(iOS 环境中的保留循环)有一些困惑。

这是我正在处理的一段代码。

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

public class HomeMoreTableViewSource: UITableViewSource
{
    public IHomeMoreTableViewSourceDelegate vDelegate;
}

视图控制器代码:

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

在 Objective-C/Swift 中,这将导致一个保留循环,打破它的方法是weak在委托变量声明之前添加关键字。

它还会是 C# 中的循环引用吗?如果是怎么破?我看到了WeakReference,但无法理解它。

标签: c#iosxamarin.ios

解决方案


一个对象引用另一个对象,而另一个对象又引用第一个对象,这绝对没问题。这就像父亲认识他的孩子一样,每个孩子当然都认识自己的父亲。在这个类比中,您有一个来自父亲的参考,一个孩子参考了父亲。

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属性。

顺便说一句,弱引用。是完全不同的东西。


推荐阅读