Xamarin.ios 为什么我必须保留对UIViewController的引用以防止它被垃圾收集?
这个问题的标题可能听起来很愚蠢,但我一直在思考以下问题:Xamarin.ios 为什么我必须保留对UIViewController的引用以防止它被垃圾收集?,xamarin.ios,Xamarin.ios,这个问题的标题可能听起来很愚蠢,但我一直在思考以下问题: 将ui视图添加到应用程序窗口。它不会旋转,因为没有实现ShouldAutoRotateToInterfaceOrientation():窗口。添加子视图(myView) 现在,以一个UIViewController为例,它在LoadView()覆盖ShouldAutoRotateToInterfaceOrientation()中创建视图。然后执行以下操作:window.AddSubView(myController.View) 在后一
- 将
添加到应用程序窗口。它不会旋转,因为没有实现ui视图
():ShouldAutoRotateToInterfaceOrientation
李>窗口。添加子视图(myView)
- 现在,以一个UIViewController为例,它在
覆盖LoadView()
中创建视图。然后执行以下操作:ShouldAutoRotateToInterfaceOrientation()
window.AddSubView(myController.View)代码>
viewDelegate
”属性,它引用了视图的控制器。
但如果这是真的,为什么我必须保留myController的引用(最好是在成员变量中),以防止它被垃圾收集?AppDelegate.cs中的我的测试用例:
public static AddView()
{
var myController = new MyController();
window.AddSubView(myController.View);
}
第一次视图将是正确的,然后控制器似乎消失了。但是,以下代码按预期工作:
var myController = null;
public static AddView()
{
this.myController = new MyController();
window.AddSubView(myController.View);
}
Monotouch构建在iOS框架之上,其核心是使用引用计数作为内存管理。即使在添加垃圾收集之后,它也不会影响底层框架。在UIView的情况下,它确实持有对其UIViewController的引用,并且控制器被垃圾收集的原因是因为iOS中的所有委托都被分配而不是保留。《苹果内存管理指南》在“对对象的弱引用”下对此进行了更详细的解释:
希望这有帮助。太棒了,谢谢!我知道您链接的文档,但我似乎忽略了代表是分配的,而不是保留的。这当然解释了!现在唯一剩下的问题是:为什么这个“_viewDelegate”属性如此安全,如果视图已经知道它的控制器,那么每个人都会将“this”(作为UIViewController)传递给视图!但是:不同的主题。通常你不需要这些信息。设计模式用于数据从控制器流入视图,而不是流出。UIView只负责显示您的数据。UIViewController负责管理数据和响应用户操作。如果您需要侦听UIControl事件,那么您应该在viewdidload期间设置这些事件,并在viewdidunload和dealloc中删除它们。是的,但是如果我的控制器管理UITableView,并且我实现了视图的GetCell(),则要求控制器在位置x处获取数据是切实可行的,因此我需要控制器参考。我明白你的意思。虽然我不熟悉monotouch如何包装objc类,但我知道UITableView有两个单独的委托。这允许您以多种方式分解管理该视图的责任。在您的例子中,我假设您对它有一个简单的用法,因此它看起来过于复杂,并且阻碍了表的实现。第6段在该链接的概述下讨论学员,可以帮助您深入了解每位学员使用的: