首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

取消排队的performSelector:afterDelay调用

取消排队的performSelector:afterDelay调用

在Swift中,performSelector:withObject:afterDelay: 方法用于让一个selector在指定的延迟时间后执行。而取消排队的 performSelector:withObject:afterDelay: 方法在指定的延迟时间后执行,并允许您取消该操作。

代码语言:swift
复制
// 取消排队的performSelector:withObject:afterDelay调用
func cancelPerformSelector(withObject: Any, afterDelay delay: TimeInterval) {
    objc_cancelPerformSelector(Selector("performSelector:withObject:afterDelay:"), withObject: withObject, afterDelay: delay)
}

要使用此功能,请调用 cancelPerformSelector(withObject:afterDelay:) 方法,传入要取消的selector和延迟时间。例如:

代码语言:swift
复制
// 取消在 2 秒后执行的 performSelector:withObject:afterDelay:
cancelPerformSelector(withObject: self, afterDelay: 2.0)

然而,要注意的是,objc_cancelPerformSelector 方法并不支持所有 selectors。支持取消的 selectors 包括:

  • performSelector:withObject:afterDelay:
  • performSelector:withObject:inMode:withArgument:
  • performSelector:withObject:afterDelay:inMode:

不支持取消的 selectors 包括:

  • performSelector:withObject:
  • performSelector:withObject:beforeDelay:
  • performSelector:withObject:afterDelay:

此外,objc_cancelPerformSelector 方法仅适用于具有延迟执行的 performSelector:withObject:afterDelay: 方法。对于没有延迟的方法,如 performSelector:withObject:,该方法将无法取消。

总之,取消排队的 performSelector:withObject:afterDelay: 调用可以通过使用 cancelPerformSelector(withObject:afterDelay:) 方法来实现。然而,要注意的是,该方法仅适用于具有延迟执行的 performSelector:withObject:afterDelay: 方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • iOS PerformSelector 遗漏问题

    performSelector:withObject:afterDelay:其实就是在内部创建了一个NSTimer,然后会添加到当前线程Runloop中。...:2]; }); 会发现test方法并没有被调用,因为子线程中runloop默认是没有启动状态。...:@selector(test) withObject:nil afterDelay:2]; }); 会发现即便添加了run方法,但是test方法还是没有被调用,在最后打印当前线程runloop,会发现...= ()}, ② test方法中执行线程 [self performSelector:@selector(test) withObject:nil afterDelay:2]; 如果在子线程中调用该...performSelector延迟方法,会发现调用该延迟方法子线程和test方法中执行子线程是同一个,也就是说: 对于该performSelector延迟方法而言,如果在主线程中调用,那么test方法也是在主线程中执行

    48610

    一个循环动画引起内存泄露问题总结

    delegate 为 strong 动画完成回调里执行了 performSelector:  [self performSelector:@selector(startBaseAnimation...第二个问题,因为 performSelector 这个方法内部是有一个 timer,该 timer 会持有 self,self 也持有该 timer,造成循环引用,所以 dealloc 就一直不调用了。...解决方法也有多个,比如说在 viewWillDisappear 里取消掉该 perform 方法(之后记得在 viewWillAppear 重新启动动画): [NSObject cancelPreviousPerformRequestsWithTarget...总结 使用 performSelector 来延时执行,要记得其内部是有一个 timer ,会持有 self,所以要注意循环引用问题,虽然在最后会自动释放,但是这样也会造成延时释放或是上述重复调用导致...目前 github 上 star 较多是 MLeaksFinder,其基本原理简单来说是 hook 掉 pop 及 dismiss 方法,在里面调用自定义 willDealloc 方法,该方法会延时几秒后进行断言

    2.4K20

    iOS Programming – 触摸事件处理(2)

    方法; 当触摸被取消(比如触摸过程中被来电打断),就会调用touchesCancelled:withEvent方法。... = [UIColor redColor];     } } 上面代码表示在第一次轻击之后,没有直接更改视图背景属性,而是通过performSelector:withObject:afterDelay...,因此在第一次点击时候,设置背景色方法已经启动,在检测到双击时候先要把先前对应方法取消掉,可以通过调用NSObject类cancelPreviousPerformRequestWithTarget...:selector:object方法取消指定对象方法调用,然后调用双击对应方法设置背景色为红色。...下面举个例子创建可以拖动视图,这个主要通过触摸对象位置坐标来实现。因此调用触摸对象locationInView:方法即可。

    91870

    编码篇-ARC下内存泄漏

    block不是self属性或者变量时,在block内使用self不会循环引用; 像这样方法中调用self,不会引起,但是属性形式中调用self就会以 [self.myTest doSomeTest...[-Warc-performSelector-leak] 正是由于动态,编译器不知道即将调用 selector 是什么,不了解方法签名和返回值,甚至是否有返回值都不懂,所以编译器无法用 ARC 内存管理规则来判断返回值是否应该释放...performSelector afterDelay 延时操作 关于内存管理执行原理是这样执行 [self performSelector:@selector(method1:) withObject...:self.tableLayer afterDelay:3]; 时候,系统会将tableLayer引用计数加1,执行完这个方法时,还会将tableLayer引用计数减1,有时切换场景时延时函数已经被调用但还没有执行...解决办法就是取消那些还没有来得及执行延时函数,代码: [NSObject cancelPreviousPerformRequestsWithTarget:self] 当然你也可以一个一个得这样用:

    1.7K20

    block与GCD--42:多用GCD,少用performSelector系列方法

    performSelector系列方法 编译器并不知道将要执行选择器是什么,也不知道该选择器是否有返回值,所以没有办法运用ARC内存管理规则判断返回值是不是应该释放 这些方法返回值只能是void或者对象类型...(id) 使用起来传入参数有限 - (id)performSelector:(SEL)aSelector; - (id)performSelector:(SEL)aSelector withObject...:(id)object; - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; - (void...)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; - (void)performSelector...方法对比(尽可能使用GCD) 延时 //performSelector [NSObject performSelector:@selector(dosomething) withObject:nil afterDelay

    11310
    领券