iPhone:NSTimer内存泄漏的小问题

iPhone:NSTimer内存泄漏的小问题,iphone,memory,memory-leaks,nstimer,Iphone,Memory,Memory Leaks,Nstimer,假设我有一个附加了iAction的按钮,它在按下时会触发几个动作,但必须以1秒的延迟触发一个特定的动作,并且只有当用户在1秒的延迟中没有再按一次按钮时。 代码如下所示: @interface Image : UIView { NSTimer *timer; } ...other things...; @end @implementation Image -(IBAction)startStopTimer{ ...do someth

假设我有一个附加了iAction的按钮,它在按下时会触发几个动作,但必须以1秒的延迟触发一个特定的动作,并且只有当用户在1秒的延迟中没有再按一次按钮时。 代码如下所示:

   @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
实际上,这段代码工作得非常好:“Delaivance”只有在用户不再按下按钮并等待至少一秒钟时才会触发

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

因此,问题是:如何以及在何处发布此NSTimer


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

据我所知,您不保留
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秒内再次单击该按钮,“计时器”将被取消并创建一个新的计时器

因此,问题是:如何以及在哪里做 我必须释放这个NSTimer


你没有。运行循环为您保留计时器,并在您调用
invalidate
方法后释放它,因此您所要做的就是在调用
scheduledTimerWithTimeInterval
时删除额外的
retain
,因为OP保留了它,所以他们需要在
dealloc
中释放它。这可能不会立即发布,如果它仍然按计划进行。我告诉他放弃额外的保留,这就是为什么我写了没有必要发布。好的,好方法如下,只需一个“performselector”。但是,如果我放弃保留,应用程序会在几秒钟后崩溃……你好,乔,非常感谢你的建议!它就像一个符咒!我用“performSelector”做了一次尝试,但我不知道我可以取消它!您刚刚在cancel的语法中犯了一个小错误:它应该是“[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething)object:nil];”再次感谢!哎呀,我真傻!我已经为其他人修改了上面的内容。谢谢