Chr*_*bax 3 memory iphone 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
Run Code Online (Sandbox Code Playgroud)
这样,这段代码工作得非常好:只有当用户不再按下按钮并等待至少一秒时,才会触发"delaiAvance".
最大的问题是:每次定时器被触发时,都会发生内存泄漏.
所以,问题是:我如何以及在何处发布此NSTimer?
(dealloc方法中的[timer release]不起作用.)
据我所知,您不会保留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!");
}
Run Code Online (Sandbox Code Playgroud)
取消的原因是,如果您在0.7秒的时间段内再次单击该按钮,则会取消"计时器"并创建一个新计时器.
| 归档时间: |
|
| 查看次数: |
1251 次 |
| 最近记录: |