show segue 后我的视图控制器没有被取消初始化
Posted
技术标签:
【中文标题】show segue 后我的视图控制器没有被取消初始化【英文标题】:My viewcontroller is not being deinitialized after show segue 【发布时间】:2016-08-29 10:56:43 【问题描述】:我创建了两个视图控制器,每个控制器都有一个按钮,用于显示与另一个视图控制器的连接。
var counter = 0
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
counter += 1
print("init viewc \(counter)")
deinit
counter -= 1
print("deinit viewc \(counter)")
似乎从来没有调用过deinit,每次我返回ViewController,计数器都在增加:
init viewc 1
init viewc 2
init viewc 3
等等...我在这里错过了什么吗?我认为 show segue 应该从内存中释放调用者,因为它不再需要。我现在每次 segue 时都会创建新的 ViewController 对象吗?
【问题讨论】:
您是否在 Storyboard 中连接的 VC 之间进行模态转换? 不,我选择了“显示”,而不是“模态呈现” 您是否尝试通过实例化来展示您的 VC? 不,我想通过 segueing 使其工作,因为我在另一个项目中有内存泄漏。看起来像这样的 segueing 可能不会像我期望的那样起作用,因为据我所知,视图控制器并没有被淘汰(所以这可能是泄漏的原因?)。 尝试模态呈现 【参考方案1】:由于您使用的是“显示”segue,因此您每次都在创建一个新的视图控制器实例,从而有效地向顶部展示更深的视图控制器“堆栈”。
如果您想在视图控制器的单个实例之间来回切换,则可以使用容器视图控制器,例如 UITabBarController
或使用 UINavigationController
并操作 viewControllers
属性
【讨论】:
我设法解决了这个问题,方法是转到一个视图控制器,然后展开回第一个视图控制器(第一个视图控制器保留但被重用,第二个被删除)。没有导航控制器持有它们。这是一个好的解决方案还是会带来其他问题? IE。这样做时是否应该始终将它们包含在导航控制器中? 不,放松转场很好。如果没有导航控制器,那么您只是在第一个视图控制器上模态显示第二个视图控制器,然后在您放松时丢弃第二个。【参考方案2】:如果您试图释放在您想要保留的视图控制器之前出现的视图控制器,并且 f 您不打算执行 unwind segue
并返回之前的 view controller
的最新状态,并且如果您想解除分配先前的视图控制器,那么您实质上是将后面的视图控制器之一视为新的rootViewController
,并且直到您重新分配AppDelegate
上的根视图控制器属性,第一个视图控制器将不会被解除分配由于rootViewController
对其有很强的引用。
UIApplication.shared.keyWindow?.rootViewController = VCTwo
【讨论】:
以上是关于show segue 后我的视图控制器没有被取消初始化的主要内容,如果未能解决你的问题,请参考以下文章
performSegueWithIdentifier 方法对于模态 segue 非常慢