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

使用performSelector:withObject:afterDelay:使用非对象参数

使用performSelector:withObject:afterDelay:方法可以实现在一定延迟时间后执行某个方法,但是这个方法只能接受对象类型的参数。如果需要传递非对象类型的参数,可以通过以下方法实现:

  1. 将非对象类型的参数封装成对象类型的参数,例如将基本数据类型封装成NSNumber对象,将C字符串封装成NSString对象等。
  2. 使用block来实现延迟执行,例如使用GCD(Grand Central Dispatch)中的dispatch_after函数,可以在指定的时间后执行某个block,同时可以在block中传递任意类型的参数。

例如,使用dispatch_after函数实现延迟执行一个方法myMethod,并传递一个整数参数42

代码语言:txt
复制
int delayInSeconds = 2.0;
int myParam = 42;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self myMethod:myParam];
});

在上面的代码中,dispatch_after函数的第一个参数是指定执行的时间,第二个参数是指定执行的队列,第三个参数是要执行的block。在block中可以传递任意类型的参数,这里传递了一个整数参数myParam

总之,使用performSelector:withObject:afterDelay:方法可以实现在一定延迟时间后执行某个方法,但是这个方法只能接受对象类型的参数。如果需要传递非对象类型的参数,可以通过将非对象类型的参数封装成对象类型的参数,或者使用block来实现延迟执行。

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

相关·内容

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

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

11010

iOS PerformSelector 遗漏问题

当我们在使用以下方法时: [obj performSelector:@selector(play)]; [obj performSelector:@selector(play:) withObject:...二 延迟执行 [obj performSelector:@selector(play) withObject:@"李周" afterDelay:4.f]; 该方法将延迟4秒后再执行play方法。...而performSelector:withObject:afterDelay:其实就是在内部创建了一个NSTimer,然后会添加到当前线程的Runloop中。...) onThread:[NSThread currentThread] withObject:nil waitUntilDone:YES]; 这个方法有一个thread参数是指定执行的线程,但是很奇怪当我使用自己创建的线程...:selector withObject:array]; NSInvocation我是在消息转发机制中认识的,所以这种方法类似于消息转发机制中的最后一层,多了创建NSInvocation对象的开销。

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

    :@selector(startBaseAnimation) withObject:nil afterDelay:pauseDuration];    } } 这里有两个问题: CABasicAnimation...) withObject:nil afterDelay:pauseDuration]; 第一个问题要么在 viewWillDisappear 时,手动置该 delegate 为 nil,要么对该 view...:@selector(startBaseAnimation) withObject:nil afterDelay:pauseDuration];    } } 而什么时候为 NO 呢,顾名思义就是动画未完成...这里就使用多一个关键帧动画操作其 opacity 参数实现隐藏 1 秒。...总结 使用 performSelector 来延时执行,要记得其内部是有一个 timer 的,会持有 self,所以要注意循环引用的问题,虽然在最后会自动释放,但是这样也会造成延时释放或是上述重复调用导致

    2.4K20
    领券