iPhone:NSTimer几乎没有内存泄漏问题

时间:2010-12-04 14:03:03

标签: iphone memory memory-leaks nstimer

假设我有一个附有IBAction的按钮,按下时会触发多个动作,但是必须触发一个延迟一秒的特定动作,并且只有当用户在此延迟中没有按下该按钮的新时间时一秒钟 代码如下所示:

   @interface Image : UIView {
           NSTimer *timer;
   }
   ...other things...;
   @end

   @implementation Image
   -(IBAction)startStopTimer{
   ...do something...;
   ...do something...;

   [timer invalidate];
   timer = [[NSTimer scheduledTimerWithTimeInterval:0.7 
      target:self 
      selector:@selector(delayedAction) 
      userInfo:nil 
      repeats:NO] retain];
   }

   -(void)delayedAction{
   ...do other things...;
   }
   @end

原样,这段代码工作得非常好:只有当用户不再按下按钮并等待至少一秒时,才会触发“delaiAvance”。

最大的问题是:每次启动计时器时,都会发生内存泄漏。

所以,问题是:我如何以及在哪里发布这个NSTimer?

(dealloc方法中的[timer release]不起作用。)

2 个答案:

答案 0 :(得分:5)

据我所知,您不会保留NSTimer个对象,因为它们被“系统”保留。通过执行invalidate,您可以从系统中释放它。

你最好的选择可能是使用performSelector:withObject:afterDelay:,因为这样可以让你轻松取消触发器,你不必创建一个完整的对象来做...如果我正确理解你的问题。要启动你要做的计时器

- (void)buttonPressed
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:nil];
    [self performSelector:@selector(doSomething) withObject:nil afterDelay:0.7];
}

- (void)doSomething
{
     NSLog(@"Something happens now!");
}

取消的原因是,如果您在0.7秒的时间段内再次点击该按钮,则会取消“计时器”并创建一个新计时器。

答案 1 :(得分:0)

  

所以,问题是:如何以及在何处进行   我必须发布这个NSTimer吗?

你没有。运行循环为您保留计时器,并在您调用invalidate方法后将其释放一段时间,这样您所要做的就是在retain的调用中删除额外的scheduledTimerWithTimeInterval