这个问题的标题可能听起来很愚蠢,但我一直想知道以下问题:
UIView
添加到应用程序窗口。它不会旋转,因为没有控制器实现ShouldAutoRotateToInterfaceOrientation
():window.AddSubView(myView)
; 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);
}
答案 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
希望这有帮助。