gpt4 book ai didi

c# - 如何打破 View Controller 和数据源之间的引用循环

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:27 24 4
gpt4 key购买 nike

考虑这个简单的例子:

public partial class TableViewController : UITableViewController
{
public TableViewController (IntPtr handle) : base (handle)
{
}

protected override void Dispose (bool disposing)
{
Console.WriteLine (String.Format ("{0} controller disposed - {1}", this.GetType (), this.GetHashCode ()));

base.Dispose (disposing);
}

public override void ViewDidLoad ()
{
//TableView.Source = new TableSource(this);
TableView.Source = new TableSource();
}
}

public class TableSource : UITableViewSource {

private TableViewController controller;
string CellIdentifier = "TableCell";

public TableSource ()
{

}

public TableSource (TableViewController controller)
{
this.controller = controller;
}

public override nint RowsInSection (UITableView tableview, nint section)
{
return 1;
}

public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
{
UITableViewCell cell = tableView.DequeueReusableCell (CellIdentifier);

//if there are no cells to reuse, create a new one
if (cell == null){
cell = new UITableViewCell (UITableViewCellStyle.Default, CellIdentifier);
}

cell.TextLabel.Text = "test";

return cell;
}
}

我注意到 View Controller (TableViewController) 从未发布过。 TableView Controller 引用了数据源,但数据源也引用了 TableView Controller 。

TableView.Source = new TableSource(); View Controller 被释放,TableView.Source = new TableSource(this); 不是。

应该如何打破这个引用循环,以便一切都得到释放?

编辑:

现在我尝试了 WeakReference:

当 View Controller 从导航堆栈弹出时,通过使用 WeakReference 调用 Dispose 方法。

ViewDidLoad 中:

TableView.Source = new TableSource(new WeakReference<TableViewController> (this));

在数据源中:

private WeakReference<TableViewController> controller;

public TableSource (WeakReference<TableViewController> controller)
{
this.controller = controller;
}

我将其构建到我的真实项目中,但如何访问我的 Controller ?我收到消息

Type 'System.WeakReference' does not contain a definition for 'xxx' and no extension method 'xxx' of type 'System.WeakReference' could be found. Are you missing an assembly reference?

最佳答案

据我所知,您使用 Xamarin 吗?你试过弱引用吗? https://msdn.microsoft.com/en-us/library/system.weakreference(v=vs.110).aspx

附言:

private WeakReference weakController; 

设置:

this.weakController = new WeakReference(controller); 

获得:

if (weakController.isAlive)
{
TableViewController controller = weakController.Target as TableViewController;
}

关于c# - 如何打破 View Controller 和数据源之间的引用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32140743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com