Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.ios 为什么我必须保留对UIViewController的引用以防止它被垃圾收集?_Xamarin.ios - Fatal编程技术网

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)
在后一种情况下,视图按预期旋转。为什么?因为它的视图控制器告诉它这样做但是视图如何知道它属于哪个控制器?我没有告诉你从ObjC人员那里,我了解到每个视图都有一个“
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段在该链接的概述下讨论学员,可以帮助您深入了解每位学员使用的: