[前几天我注意到我的iOS应用正在像筛子一样泄漏内存(我编写了一些自动测试,这些测试长期运行失败,然后我注意到应用的大小会不断增长,直到它死掉。]]
我早就怀疑,我将对闭包变量有更多的纪律。因此,我花了整整一天的时间来弄清楚我的应用程序在哪里泄漏内存。到目前为止,Xcode工具并没有太大帮助。
不久前,我有自己的股票行情指示器(定期计时器):
class Ticker { // MARK: - Properties Stored var interval:Duration = 1.seconds private var queue = DispatchQueue.main private var source: DispatchSourceTimer! var tick:()->() = {} // MARK: - accessing func start() { self.stop() self.source = DispatchSource.makeTimerSource(queue: self.queue) let nsgap = DispatchTimeInterval.microseconds(Int(self.interval.microseconds.rounded().magnitude)) self.source.schedule(deadline: DispatchTime.now() + nsgap, repeating: nsgap, leeway: DispatchTimeInterval.seconds(0)) self.source.setEventHandler(handler: self.tick) self.source.resume() } func stop() { if self.source != nil { self.source.cancel() self.source = nil } } }
然后我有一个UIController子类,该子类首先将其中一个作为变量:
class MyController: UIViewController { var connectTimer:Ticker = Ticker() ...
后来有一个看起来像这样的方法:
@IBAction func startScanning() { self.stopScanning() ... self.scanTimer = Ticker() self.scanTimer.interval = 500.milliseconds var tickCount = 0 self.scanTimer.tick = { tickCount += 1 if tickCount > 20 { self.stopScanning() } if self.bleBecameActive { self.bleBecameActive = false self.startBLEScan() } } self.scanTimer.start() }
我了解事物的方式...我的控制器对计时器有严格的参考。计时器对闭包(tick变量)有严格的引用。并且闭包引用了自我。那不应该创造一个周期吗?
但是Debug Memory Graph根本没有显示这是一个问题。为什么不?是a)确实不是问题,还是b)工具没有按照我的想法去做?
[前几天,我注意到我的iOS应用正在像筛子一样泄漏内存(我编写了一些自动测试,这些测试长期运行失败,然后我注意到应用的大小会不断增长,直到它死掉为止)。我已经很久了...
在这种情况下,我通常利用Abandoned Memory
来识别潜在的问题。尽管此article很旧,但它讨论了如何解决它。多次执行相同的交互后,请检查您的应用创建的尚未发布的类(而不是系统的类)。