【发布时间】:2017-09-05 06:50:48
【问题描述】:
今天我正在阅读swift编程指南here中的“闭包的强参考循环”,我的问题就是基于此。
我在导航控制器中嵌入了两个视图控制器,我在第一个视图控制器中没有任何内容,只是用来连接到 secondviewcontroller,并且我在 secondViewcontroller aka ViewController2 中有以下代码。
代码 1:
class ViewController2: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (_) in
print("timer")
}
}
}
弹出到第一个视图控制器后,此计时器不会结束,它会不断打印“计时器”。如何停止?,下面是调试内存图的屏幕截图。
如上图我们可以看到没有第二个视图控制器的实例,但是定时器会连续执行!
如果我在计时器关闭时持有或使用 self 的强 ref,那么我相信没关系。但是根据上面的代码,我没有持有或使用任何强引用,它也显示在调试内存图中(pop 后没有 secondviewcontroller 的引用)。
如果我使用下面的代码,那么我接受计时器正在运行,因为按照下面的代码强引用周期。
代码 2:
class ViewController2: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (_) in
print("\(self.view.tag)")
}
}
}
下面是调试内存图,弹出到第一个视图控制器后,可以看到第二个视图控制器引用仍然存在。
根据我的代码 2 部分,我可以接受它正在运行,因为 viewcontroller2 仍在内存中并正在运行。但是在我的代码 1 部分中,没有任何迹象表明 viewcontrller2 在内存中并且它的计时器有效吗?为什么 ? 如何在不将其作为实例的情况下停止此操作。
【问题讨论】:
-
这里有什么问题?您想知道为什么在第二个代码中的内存中保留了对 secondVC 的引用,为什么不在第一个代码中?或者你只需要知道当你弹出到 First VC 时如何停止时间?
-
是的,当你跳到First VC时如何停止时间
-
你确定你已经正确地弹回了第一个 VC 吗?你确定你没有将另一个新的 VC1 推到导航堆栈上吗?因为在最后一张图中,说明VC2还是被
UINavigationController保留的。 -
我的问题是关于代码 1 部分,我正在显示代码 2 部分以供参考(我接受的内容)
-
当你使用代码 1 时,看看是什么保留了
ViewController2。UINavigationController还保留它吗?
标签: ios swift memory-management timer closures