我在 View Controller 中有一个 NSTimer
strong 属性。我通过调用此方法创建并启动此计时器:
- (void)startTimer
{
if (self.timer != nil) {
[self.timer invalidate];
}
self.timer = [NSTimer scheduledTimerWithTimeInterval:10
target:self
selector:@selector(timerDidFinish:)
userInfo:nil
repeats:NO];
}
然后,当 timerDidFinish:
被调用时,我调用这个方法来停止计时器:
- (void)stopTimer
{
if (self.timer != nil) {
[self.timer invalidate];
self.timer = nil;
}
}
然后,我执行一些操作。在这些操作结束时,我再次调用 startTimer
。我需要这样做以保持定期执行我需要的操作,并在操作之间始终保持相同的时间(10 秒)。
在 Instruments
中,使用 Leaks
模板并导航到具有此计时器的 View Controller ,我发现在 iOS 7 设备中运行 Live Bytes
值和分配图随时间或多或少保持不变:
但是在 iOS 6 设备上运行同样的场景,Live Bytes
和 Allocations 图表稳步增加:
我该如何处理?
谢谢
最佳答案
您应该尝试堆射击分析方法以获得有关此可能泄漏的更多信息。 该方法非常简单:
使用仪器启动调试 session ,然后使用 NSTimer
属性转到您的 viewController。稍等片刻(例如,超过 10 秒让您的计时器至少完成一次,或者如果您知道计时器何时结束,您可以等待更多迭代),然后返回到前一个 View Controller 。在仪器中,按“标记生成”。
此时您现在有了内存的即时表示。回到你的 View Controller ,等待,弹出它,创建另一代,然后重复几次。
您应该以这样的 View 结束:
每一代都由一面红旗代表。 增长列表示两代之间的内存分配。如果你不泄漏,增长应该在几个周期内等于 0 字节。如果没有,你可以通过扩展世代来查看增长的细节,并查看在世代之间分配了哪些对象。它应该可以帮助您找到问题。
有关 Instruments 的更多信息,您应该阅读这个很棒的教程:http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode
关于ios - iOS 6 中的 NSTimer 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24819355/