我在视图控件中有一个NSTimer强属性。我通过调用此方法创建并启动此计时器:
- (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模板并导航到具有此计时器的视图控制器,我发现在iOS 7设备中运行时,Live Bytes值和分配图随着时间的推移或多或少保持不变:

但在iOS 6设备上运行同样的场景,Live Bytes和分配图稳步增长:

我该怎么处理呢?
谢谢
发布于 2014-07-18 16:15:33
您应该尝试堆快照分析方法,以获得有关此可能泄漏的更多信息。这个方法非常简单:
使用instruments启动调试会话,并使用NSTimer属性转到viewController。稍等片刻(例如,超过10秒可以让您的计时器至少完成一次,或者,如果您知道计时器何时结束,则可以等待更多迭代),然后弹回上一个视图控制器。在仪器中,按“标记生成”。此时,您就拥有了内存的即时表示。返回到视图控制器,等待,将其弹出,创建另一代,然后重复几次。
您应该以如下所示的视图结束:

每一代都用一面红旗表示。growth列表示两代之间的内存分配。如果没有泄漏,在几个周期内增长应该等于0字节。如果没有,您可以通过扩展世代来查看增长的细节,并查看在世代之间分配了哪些对象。它应该可以帮助您定位您的问题。
有关工具的更多信息,您应该阅读这个很棒的教程:http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode
https://stackoverflow.com/questions/24819355
复制相似问题