c# - 循环参考/保留周期
问题描述
我来自 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,但无法理解它。
解决方案
一个对象引用另一个对象,而另一个对象又引用第一个对象,这绝对没问题。这就像父亲认识他的孩子一样,每个孩子当然都认识自己的父亲。在这个类比中,您有一个来自父亲的参考,一个孩子参考了父亲。
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
属性。
顺便说一句,弱引用。是完全不同的东西。
推荐阅读
- jenkins - 仅在 Jenkins 中运行时,屏幕截图未附加到扩展报告
- javascript - ng-circle-progress 需要时间来显示正确的值
- node.js - 从 VSCode 上传 Azure 应用程序而不链接静态源
- azure - 通过 API 获取 Azure 安全中心任务
- spark-streaming - 异常:org.apache.spark.sql.delta.ConcurrentAppendException:文件通过并发更新添加到表的根目录
- python - 基于其他列组合的新列
- mule-studio - 将 Anypoint Studio 7.4 移动到 7.9 时出现问题?
- python - 光栅图中带有五分位数的自定义连续颜色条(rasterio 或 rioxarray)?
- jenkins - Jenkins - 从上一份工作中获取数据
- python - 在对数图中仅显示某些刻度标签