Swift:NSTimer内存泄漏

时间:2016-07-11 15:03:15

标签: ios swift sockets memory-leaks nstimer

我正在运行一个快速的NSTimer(每0.15秒),我发现大约每10秒钟内存增加约0.5mb。

这是我的代码:

    dispatch_async(dispatch_get_main_queue(),{
        //Prepare timer handshake
        if let tmr = self.tmrHandshake {
            tmr.invalidate()
            self.tmrHandshake = nil
        }
        self.tmrHandshake = NSTimer.scheduledTimerWithTimeInterval(0.15, target: self, selector: #selector(self.sendLifeBeat), userInfo: nil, repeats: true)
        NSRunLoop.mainRunLoop().addTimer(self.tmrHandshake!, forMode: NSRunLoopCommonModes)
    })

选择方法:

dynamic private func sendLifeBeat() {
    let dataBytes = NSMutableData(data: lifebeatCmd.dataUsingEncoding(NSUTF8StringEncoding)!)
    dataBytes.appendData(terminator.dataUsingEncoding(NSUTF8StringEncoding)!)

    socketClient!.writeData(dataBytes, withTimeout: 5, tag: 1)
}

这些" dispatch_async"在后台线程上运行的方法内部调用。

您对如何解决此问题有任何建议吗? 感谢。

2 个答案:

答案 0 :(得分:1)

在闭包中使自己成为弱或无主的引用 - 你有一个参考循环并且它没有解除分配

答案 1 :(得分:0)

使用Instruments配置应用程序,选择“Leaks”模板,选中“Discard events for freed memory”和“Enable NSZombie detection”。检查未解除分配的对象。

如果您正在使用XCode 8,您应该会在“运行时”下的“问题导航器”中看到内存泄漏。

当我发现泄漏时,这就是我要做的事情。尝试自己调试,我在你的例子中看不到任何错误的代码。