iOS 视图控制器未发布?

Posted

技术标签:

【中文标题】iOS 视图控制器未发布?【英文标题】:iOS View Controllers not being released? 【发布时间】:2013-08-16 18:39:12 【问题描述】:

(我使用的是 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 也会被调用。当它作为子控制器被删除并且没有引用它时,这怎么可能。

(当我使用 Storyboard 中设置的 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!

有什么想法吗?

【问题讨论】:

添加 c# 标签会有所帮助,因为它与 Obj-C 语法不同(即“this.”在 Obj-C 中是“self.”)。 【参考方案1】:

可能是你的视图控制器的初始化方法有一些副作用导致它保持活动状态。一个常见的例子是它创建了一个NSTimer 对象,该对象保留了它的目标。浏览从情节提要中实例化视图控制器时调用的方法,看看是否有任何东西保留它。

【讨论】:

嗯,在一个案例中,我确实有一个带有 System.Timers.Timer 的 VC,并且确实解决了它 - 非常感谢!我不得不停止它,删除事件并将其设置为 null 以最终将其释放。不过,我还有另一个 VC 不会发布,并且没有计时器或其他任何我能看到的东西。还有什么好主意吗?有没有办法找出它保留的原因?这是一个以 UIViewController 作为根 vc 的 UINavigationController。

以上是关于iOS 视图控制器未发布?的主要内容,如果未能解决你的问题,请参考以下文章

推送视图控制器未推送 ios 7

iOS - 视图未打开(导航控制器应用程序)

“viewWillTransitionToSize:”当视图控制器以模态方式呈现时在 iOS 9 中未调用

IOS - 未调用 Facebook SDK fbDidLogin - 初始化视图控制器。

iOS 8.4 - iboutlet 未填充到以编程方式创建的视图控制器中

使用 CAPSPageMenu 控制器标题的页面视图控制器未根据 iOS 10 中的屏幕大小显示?