ios - iOS 6 中的 NSTimer 内存管理

标签 ios xcode memory-management nstimer instruments

我在 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 7 screenshot

但是在 iOS 6 设备上运行同样的场景,Live Bytes 和 Allocations 图表稳步增加:

iOS 6 screenshot

我该如何处理?

谢谢

最佳答案

您应该尝试堆射击分析方法以获得有关此可能泄漏的更多信息。 该方法非常简单:

使用仪器启动调试 session ,然后使用 NSTimer 属性转到您的 viewController。稍等片刻(例如,超过 10 秒让您的计时器至少完成一次,或者如果您知道计时器何时结束,您可以等待更多迭代),然后返回到前一个 View Controller 。在仪器中,按“标记生成”。 此时您现在有了内存的即时表示。回到你的 View Controller ,等待,弹出它,创建另一代,然后重复几次。

您应该以这样的 View 结束:

ios Instruments heap generation

每一代都由一面红旗代表。 增长列表示两代之间的内存分配。如果你不泄漏,增长应该在几个周期内等于 0 字节。如果没有,你可以通过扩展世代来查看增长的细节,并查看在世代之间分配了哪些对象。它应该可以帮助您找到问题。

有关 Instruments 的更多信息,您应该阅读这个很棒的教程:http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode

关于ios - iOS 6 中的 NSTimer 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24819355/

相关文章:

iphone - iOS 上的蓝牙连接 - 建立连接时应用程序崩溃

ios - 在 iOS 中使用 UIPickerView 时遇到问题

android - 查找适用于 Android 和/或 iOS 的 native Youtube 应用程序的用户代理

xcode - 如何为 Cocoa Pods 正确配置我的项目?

iphone - 检测/修复内存泄漏

c++ - Objective C 的 Xcode 6 上出现错误 'Undefined symbols for architecture x86_64 '

ios - 如何保留 UIView Controller (ARC)

c++ - 是否有固定大小分配器的优雅 C++ 实现?

ios - 以编程方式将源代码添加到 Xcode 目标

c++ - 这会彻底清除类对象动态分配的结果吗?