iOS视图控制器未发布?

时间:2013-08-16 18:39:13

标签: c# ios uiviewcontroller release didreceivememorywarning

(我使用c#/ Xamarin,但怀疑这个问题是特定的。)

当我添加一个视图控制器然后删除它时 - 仍然会调用它的DidReceiveMemoryWarning(在模拟器和实际设备上),因此它不能被释放。我把它缩小到了这个范围: -

UIViewController vc=(UIViewController)this.Storyboard.InstantiateViewController(identifier);
this.AddChildViewController(vc);
vc.RemoveFromParentViewController();
vc=null;

并且调用DidMoveToParentViewController和WillMoveToParentViewController(如文档中所述)也没有帮助:

UIViewController vc=(UIViewController)this.Storyboard.InstantiateViewController(identifier);
this.AddChildViewController(vc);
vc.DidMoveToParentViewController(this);
vc.WillMoveToParentViewController(null);
vc.RemoveFromParentViewController();
vc=null;

然后模拟内存警告,即使没有对它的引用,也会调用vc DidReceiveMemoryWarning。如果将它作为子控制器删除并且没有引用它,这怎么可能。

(当我在故事板中使用segue设置转到UINavigationController中的详细视图时,也会发生同样的事情,例如,在向"返回"到根控制器之后,细节控制器仍然获取DidReceiveMemoryWarning消息。

任何帮助理解这一点都将不胜感激

更新 现在我遇到的问题是在UINavigationController中嵌入了一个简单的UIViewController

我添加导航控制器:

this.nc=(UINavigationController)this.Storyboard.InstantiateViewController("NavigationController");
this.AddChildViewController(this.nc);
this.nc.DidMoveToParentViewController(this);

并稍后删除(加载后):

this.nc.WillMoveToParentViewController(null);
this.nc.RemoveFromParentViewController();
this.nc=null;

这一切都很好(它没有保留)。但是如果我在嵌入的ViewController的ViewDidLoad方法中添加这个简单的行,那么ViewController IS就会被保留!

Console.WriteLine("this.NavigationController={0}",this.NavigationController);

即,只需访问" this.NavigationController"导致VC被保留!

所以每次运行它时,我都会保留另一个ViewController!

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

可能是你的视图控制器的初始化方法有一些副作用导致它保持活着。一个常见的例子是它创建了一个NSTimer对象,它保留了它的目标。浏览从故事板中实例化视图控制器时调用的方法,并查看是否有任何保留它。