首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 6中的NSTimer内存管理

iOS 6中的NSTimer内存管理
EN

Stack Overflow用户
提问于 2014-07-18 15:21:32
回答 1查看 313关注 0票数 1

我在视图控件中有一个NSTimer强属性。我通过调用此方法创建并启动此计时器:

代码语言:javascript
复制
- (void)startTimer
{
   if (self.timer != nil) {
       [self.timer invalidate];
   }

   self.timer = [NSTimer scheduledTimerWithTimeInterval:10
                                                 target:self
                                               selector:@selector(timerDidFinish:)
                                               userInfo:nil
                                                repeats:NO];
}

然后,当调用timerDidFinish:时,我调用此方法来停止计时器:

代码语言:javascript
复制
- (void)stopTimer
{
   if (self.timer != nil) {
       [self.timer invalidate];
       self.timer = nil;
   }
}

在那之后,我会执行一些操作。在这些操作结束时,我再次调用startTimer。我需要这样做,以保持定期执行所需的操作,并在两次操作之间始终保持相同的时间(10秒)。

Instruments中,使用Leaks模板并导航到具有此计时器的视图控制器,我发现在iOS 7设备中运行时,Live Bytes值和分配图随着时间的推移或多或少保持不变:

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

我该怎么处理呢?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-07-18 16:15:33

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

使用instruments启动调试会话,并使用NSTimer属性转到viewController。稍等片刻(例如,超过10秒可以让您的计时器至少完成一次,或者,如果您知道计时器何时结束,则可以等待更多迭代),然后弹回上一个视图控制器。在仪器中,按“标记生成”。此时,您就拥有了内存的即时表示。返回到视图控制器,等待,将其弹出,创建另一代,然后重复几次。

您应该以如下所示的视图结束:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24819355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档