我的一个视图控制器中存在强烈引用的问题,这会导致内存泄漏。首先,我的设置:
2视图控制器(v1和v2)。v1连接到v2,而v2有一个关闭按钮,它会弹回v1。v2包含的代码试图无限地重新连接,直到连接建立为止。(使用red5pro的视频流)。以下是代码:
func reconnect(){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(5.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
self.connectToStream()
}
}在我的情况下,连续重新连接是可取的,但是当用户退出v2时,我希望重新连接停止。但是目前,即使用户已经离开了v2,重新连接也会无限地进行。
我已经知道,这是因为v2有很强的引用,即使在用户退出之后也会继续存在。因此,这将导致无限调用reconnect()方法的代码继续运行。我将尝试清理v2,将所有内容转换为弱引用,但我也考虑了一些替代方法,并对此提出了几个问题:
发布于 2016-12-13 18:48:21
不能取消dispatch_after,但是有几个选项:
self:
函数重新连接(){ dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(5.0 *Double(NSEC_PER_SEC)),dispatch_get_main_queue(){ self?.connectToStream() }中的弱自
诚然,这会使计时器保持正常运行,但会阻止它保留视图控制器,因此将释放视图控制器,并且不会调用connectToStream。NSTimer并取消它:
弱变量计时器: NSTimer?{ timer?.invalidate() timer = NSTimer.scheduledTimerWithTimeInterval(5.0,目标: self,选择器:#selector(handleTimer(_:)),userInfo: nil,重复: false) } func handleTimer(timer: NSTimer) { self.connectToStream() }覆盖func viewDidDisappear() { super.viewDidDisappear() timer?.invalidate() }}
注意,由于这个selector-based NSTimer保留了对其target的强引用,所以不能在deinit中取消(因为有一个强引用周期)。因此,您必须找到其他适当的事件来解决这个问题(例如,viewDidDisappear)。https://stackoverflow.com/questions/41127663
复制相似问题