概述
performSelector: withObject:
是 runtime 在运行时去查找方法的,编译时不做校验,因此如果找不到对应的 selector 会产生 crash,因此最好与 - (BOOL)respondsToSelector:(SEL)aSelector;
配合使用。
与直接调用方法的区别
直接调用方法,在编译时便可做校验,如果找不到方法,Xcode 会直接提示。
performSelector: withObject: afterDelay:
该方法是创建一个定时器,因此如果是在子线程,该方法对应的 selector 默认不会运行。因为子线程默认没有 RunLoop,需要 [[NSRunLoop currentRunLoop] run];
创建并启动子线程的 RunLoop,代码如下
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:0];
[[NSRunLoop currentRunLoop] run];
});
备注: performSelector: withObject: afterDelay:
要放到 [[NSRunLoop currentRunLoop] run];
的前面,否则 RunLoop 会直接退出。
网友评论