didReceiveMemoryWarning

didReceiveMemoryWarning

(我使用的是C#/ Xamarin,但怀疑该问题是否特定于此。)

当我添加一个View Controller并将其删除时-它的DidReceiveMemoryWarning仍被调用(在Simulator和真实设备中),因此无法发布。我将其范围缩小到:

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!
Console.WriteLine("this.NavigationController={0}",this.NavigationController);

即,仅访问“this.NavigationController”将导致保留VC!

因此,每次运行它时,都会保留另一个ViewController!

有任何想法吗?

最佳答案

可能是您的视图控制器的初始化方法有一些副作用,导致它仍然存在。一个常见的示例是它创建一个NSTimer对象,该对象保留其目标。查看从情节提要中实例化视图控制器时调用的方法,看看是否有保留的东西。

10-08 11:51