工作中我们可能会遇到这种场景:我们需要倒计时 10s 后去执行一个方法,再倒计时过程中,我们接到命令,要重新倒计时 10s 后去执行,直接上代码
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:nil];
[self performSelector:@selector(doSomething) withObject:nil afterDelay:10];
解读:
我们通过 performSelector: withObject: afterDelay: 方法来延时将某个方法延时添加到队列中执行。
在延时过程中,我不需要执行该方法了,需要把它取消掉,我们可以用到
[NSObject cancelPreviousPerformRequestsWithTarget:self]; // 取消当前 run loop 里面所有未执行的延迟方法
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(方法名) object:nil]; // 指定取消 未执行的一条或者多条的延迟方法
需要注意:
performSelector 计时器导致内存泄漏
倒计时会对对象强引用,只有在倒计时结束之后,引用对象才会释放
如果提前结束倒计时,释放对象,可以使用 cancelPreviousPerformRequestsWithTarget
取消performSelector计时调用方法,参数 object 必须一致
[self performSelector:@selector(doSomething) withObject:@“test” afterDelay:10];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:@“test”];
如果 object 不一致,无法取消 performSelector 方法:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:nil];