我来自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,但没有多大意义。
答案 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
属性。
弱引用顺便说一句。完全不同。