代码之家  ›  专栏  ›  技术社区  ›  Rishab

圆形参考/保留圆柱

  •  0
  • Rishab  · 技术社区  · 6 年前

    我来自客观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 但没什么意义。

    1 回复  |  直到 6 年前
        1
  •  2
  •   MakePeaceGreatAgain    6 年前

    一个对象引用另一个对象,而另一个对象又引用第一个对象,这是完全可以的。这和父亲认识孩子一样,每个孩子当然都认识自己的父亲。在这个类比中,你从父亲提到了一个孩子,他提到了父亲。

    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 财产。

    一个weakreference btw.是完全不同的东西。