为啥我的视图控制器没有释放?

Posted

技术标签:

【中文标题】为啥我的视图控制器没有释放?【英文标题】:why are my view controllers not releasing?为什么我的视图控制器没有释放? 【发布时间】:2017-07-13 16:28:24 【问题描述】:

我有两个故事板第一个故事板 rootviewcontroller 包含两个容器 每个容器指向 1)首先将 segue 嵌入到视图控制器中,该控制器又包含一个容器到其他视图控制器。 2)第二次将segue嵌入到其他故事板

在应用首次启动时,我们将进入第一个登录流程,一旦登录成功,我将通过从当前容器中删除所有视图来调用执行 segue 到其他故事板。

但是当我移动到具有自己的导航控制器的其他情节提要时,所有视图控制器都没有释放。

【问题讨论】:

【参考方案1】:

我不确定我是否理解您所说的通过删除所有视图来进行转移的意思但是...

如果我的问题没有错,您正在使用两个故事板来支持您的应用程序的两个流程。

流程1.应用注册流程

流程2.(App已经注册)注册后直接进入界面

您不需要有两个独立的故事板来执行相同的工作,因为它是一个单独的流程。

在您的 appDelegate 上检查您是否已注册并以编程方式更改根视图控制器,以便用户跳转到正确的屏幕。

注意:您必须向可选的根视图控制器添加一个标识符

self.window?.rootViewController = mainStoryboard?.instantiateViewControllerWithIdentifier("tabBarVCID")

如果 deinit 没有被调用,你可能有一个强大的引用循环 这会阻止 VC 的释放

在The Swift Programming Language: Automatic Reference Counting 的解决类实例之间的强引用循环部分,Apple 描述了如何解决这个问题:

Swift 提供了两种解决强引用循环的方法: 使用类类型的属性:弱引用和无主 参考文献。

弱引用和无主引用在引用周期中启用一个实例 引用另一个实例而不牢牢抓住它。 然后实例可以相互引用,而无需创建强 参考循环。

【讨论】:

我在说什么我正在调用 peform segue 去另一个故事板并从当前容器的超级视图中删除所有视图(这是登录流程)。我有其他故事板,因为它依次有许多视图控制器.如果我在登录 rootview 控制器后检查新的控制器,因为它有自己的导航控制器,但登录/登录视图控制器 deinits 没有调用。

以上是关于为啥我的视图控制器没有释放?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的一些视图控制器没有收到 didReceiveMemoryWarning?

如何释放子视图控制器的内存

为啥我的视图控制器没有检索到我的 CoreData 对象

iOS:关闭时视图控制器未释放

为啥我的用户数据没有使用资源控制器中的 show 方法传递到页面视图?

当我迅速从该视图控制器移动时,为啥我的 Collectionview 单元格没有显示?