gpt4 book ai didi

iPhone : little problem of memory leak with NSTimer

转载 作者:行者123 更新时间:2023-12-03 19:40:20 25 4
gpt4 key购买 nike

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

最佳答案

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

关于iPhone : little problem of memory leak with NSTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4353860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com