首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有强引用导致内存泄漏的视图控制器

具有强引用导致内存泄漏的视图控制器
EN

Stack Overflow用户
提问于 2016-12-13 17:59:56
回答 1查看 817关注 0票数 1

我的一个视图控制器中存在强烈引用的问题,这会导致内存泄漏。首先,我的设置:

2视图控制器(v1和v2)。v1连接到v2,而v2有一个关闭按钮,它会弹回v1。v2包含的代码试图无限地重新连接,直到连接建立为止。(使用red5pro的视频流)。以下是代码:

代码语言:javascript
复制
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,将所有内容转换为弱引用,但我也考虑了一些替代方法,并对此提出了几个问题:

  1. 是否有一种方法可以终止viewDidDisappear上的重新连接,所以即使我的视图控制器没有被破坏,至少我的重新连接过程停止了?
  2. 退出v2返回到v1之后,如果用户再次使用v2,那么是否可以为v2分配相同的实例,而不是每次创建一个新的实例?
EN

回答 1

Stack Overflow用户

发布于 2016-12-13 18:48:21

不能取消dispatch_after,但是有几个选项:

  1. 使用弱引用,这将允许释放self: 函数重新连接(){ dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(5.0 *Double(NSEC_PER_SEC)),dispatch_get_main_queue(){ self?.connectToStream() }中的弱自 诚然,这会使计时器保持正常运行,但会阻止它保留视图控制器,因此将释放视图控制器,并且不会调用connectToStream
  2. 当视图消失时,使用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)。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41127663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档