当前位置: 首页 > 编程语言 > C#

如何打破ViewController和DataSource之间的引用循环分享

时间:2023-04-10 21:43:43 C#

如何打破ViewController和DataSource之间的引用循环考虑这个简单的例子:publicpartialclassTableViewController:UITableViewController{publicTableViewController(IntPtrhandle):base(handle){}protectedoverridevoidDispose(booldisposing){Console.WriteLine(String.Format("{0}controllerdisposed-{1}",this.GetType(),this.GetHashCode()));base.Dispose(处置);}publicoverridevoidViewDidLoad(){//TableView.Source=newTableSource(this);TableView.Source=newTableSource();}}publicclassTableSource:UITableViewSource{privateTableViewControllercontroller;stringCellIdentifier="TableCell";publicTableSource(){}publicTableSource(TableViewControllercontroller){this.controller=controller;}publicoverridenintRowsInSection(UITableViewtableview,nintsection){return1;tableView,NSIndexPathindexPath){UITableViewCellcell=tableView.出队重用ableCell(CellIdentifier);//如果没有可重用的单元格,则创建一个新单元格if(cell==null){cell=newUITableViewCell(UITableViewCellStyle.Default,CellIdentifier);}cell.TextLabel.Text="测试";返回单元格;我注意到视图控制器(TableViewController)从未发布过表视图控制器对数据源的引用,但数据源也有对表视图控制器的引用。使用TableView.Source=newTableSource();视图控制器被释放,使用TableView.Source=newTableSource(this);不是。应该如何打破这个引用循环,让一切都得到释放?编辑:现在我尝试了WeakReference:通过使用Wea??kReference,当视图控制器从导航堆栈中弹出时,将调用Dispose方法。在ViewDidLoad中:TableView.Source=newTableSource(newWeakReference(this));在DataSource中:私有WeakReference控制器;publicTableSource(WeakReferencecontroller){this.controller=controller;我将它构建到我的真实项目中,但如何访问我的控制器?我收到消息“System.WeakReference”类型不包含“xxx”的定义,并且未找到“System.WeakReference”类型的扩展方法“xxx”。您错过了装配参考吗?你看,你使用Xamarin工作?你试过弱引用吗?https://msdn.microsoft.com/en-us/library/system.weakreference(v=vs.110).aspxPS:privateWeakReferenceweakController;设置:this.weakController=newWeakReference(controller);得到:if(weakController.isAlive){TableViewControllercontroller=weakController.TargetasTableViewController;将publicpartialclassTableViewController:UITableViewController更改为publicpartialclassTableViewController:UITableViewController,UITableViewSource并且在ViewDidLoad中正在执行self.TableView.Source=self;source属性在内部它已经是一个弱引用,所以你管理它没有问题。将TbaleViewController作为委托和数据源完全是一个方便的属性。(就像在原生iOS中一样)可以把方法移到controller本身,这样比WeakReference麻烦多了。这些然后用导出属性标记,然后允许您将UITableView.WeakDataSource属性设置为控制器本身。[Export("tableView:numberOfRowsInSection:")]publicnintRowsInSection(UITableViewtableview,nintsection)[Export("tableView:cellForRowAtIndexPath:")]publicUITableViewCellGetCell(UITableViewtableView,NSIndexPathindexPath)移动后可以附加数据源:以上是C#学习教程:如何打破viewcontroller和datasource之间的循环引用。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——publicoverridevoidViewDidLoad(){TableView.WeakDataSource=this;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: