泄露的对象NSDate:ResumeTimer& PauseTimer

时间:2012-06-27 16:16:58

标签: iphone

在Instrumens中测试应用程序内存泄漏因多次使用pauseTimer和resumeTimer而导致多次泄漏。

在m档中定义

NSDate *pauseStart, *previousFireDate;

-(void)pauseTimer{
pauseStart = [[NSDate dateWithTimeIntervalSinceNow:0] retain];
previousFireDate = [[timer fireDate] retain];
[timer setFireDate:[NSDate distantFuture]];
}

  -(void)resumeTimer{
float pauseTime = -1*[pauseStart timeIntervalSinceNow];
//[timer setFireDate:[previousFireDate initWithTimeInterval:pauseTime sinceDate:previousFireDate]];
[timer setFireDate:[NSDate dateWithTimeInterval:pauseTime sinceDate:previousFireDate]];
}

如何修复pauseTimer和resumeTimer的内存泄漏。用户可以多次使用PauseTimer和resumeTimer。

感谢帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

每次触发pauseStart方法时,您都会保留previousFireDatepauseTimer的值。您需要在保留新值之前释放先前的值,以避免内存泄漏。

最简单的解决方案是为这些值创建两个保留属性(可能在类扩展中),因此当您设置新值时,将为您处理该版本。 (只是不要忘记在dealloc方法中释放值以避免泄漏。)

答案 1 :(得分:0)

您可以使用NSTimer的isValid属性和invalidate方法。

-(void)pauseTimer
{
    if ( !timer.isValid )
        return;

    // remember your fire date

    [timer invalidate];
}

-(void)resumeTimer
{
    if ( timer.isValid )
        return;

    // schedule your timer to new date
    // release old date
}