【问题标题】:iPhone : little problem of memory leak with NSTimeriPhone:NSTimer 内存泄漏的小问题
【发布时间】:2011-05-20 05:24:54
【问题描述】:

假设我有一个附加了 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方法中的[定时器释放]不起作用。)

【问题讨论】:

    标签: iphone memory memory-leaks nstimer


    【解决方案1】:

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

    【讨论】:

    • 您好乔,非常感谢您的建议!它就像一个魅力!我已经尝试过“performSelector”,但我不知道我可以取消它!您只是在 cancel 的语法中犯了一个小错误:它应该是“[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:nil];”再次感谢!
    • 哎呀,我真傻!我已经为其他人修改了上面的内容。谢谢!
    【解决方案2】:

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

    你没有。运行循环会为您保留计时器并在您调用invalidate 方法后释放它,因此您所要做的就是在对scheduledTimerWithTimeInterval 的调用中删除额外的retain

    【讨论】:

    • 由于OP保留了它,他们需要在dealloc发布它。如果它仍然计划起飞,那可能不会立即释放它。
    • 我告诉他放弃额外的保留,这就是为什么我写了没有必要发布。
    • 好的,下面是好方法,只需一个“performselector”。但是,如果我放弃保留,应用程序会在几秒钟后崩溃......
    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多