为什么我必须保持对我的UIViewController的引用以防止它被垃圾收集?

时间:2011-04-12 21:17:48

标签: xamarin.ios

这个问题的标题可能听起来很愚蠢,但我一直想知道以下问题:

  • UIView添加到应用程序窗口。它不会旋转,因为没有控制器实现ShouldAutoRotateToInterfaceOrientation():window.AddSubView(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);
}

1 个答案:

答案 0 :(得分:3)

Monotouch构建于iOS框架之上,其核心是使用引用计数作为其内存管理。即使在添加垃圾收集之后,它也不会影响底层框架。在UIView的情况下,它确实包含对其UIViewController的引用,以及控制器获取垃圾的原因是因为iOS中的所有委托都被分配而不是保留。苹果内存管理指南在“对象的弱引用”下更详细地解释了这一点:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html%23//apple_ref/doc/uid/20000043-BEHDEDDB

希望这有帮助。