PerformSelector相关
2020-05-27 本文已影响0人
wpf_register
PerfomSelector调用与直接调用区别
-
performselector 是运行时系统负责找方法,在编译时不做任何校验,如果方法不存在,运行时程序才会崩溃;
如果直接调用编译时会自动校验,如果方法不存在,在编译时就能够发现。Cocoa 支持友运行时向某个类添加方法,即方法编译时不存在,但运行时存在,这时必须使用PerformSelector调用。
-
直接调用方法时,一定要在头文件中声明该方法的使用,也要将头文件import进来,
而使用PerformSelector时,不用import头文件 。 -
PerfomSelector 是在iOS 中的一种方法调用方法,他可以向一个对象传递任何消息,而不需要在编译时声明这些方法,所以这也是runtime的一种应用方式。
所以两者的区别就在Runtime,直接调用编译是自动校验,如果不存在,直接在编译时发现,编译器就会直接报错。
但Performselector一定是运行时发现的,如果方法不存在就会崩溃。
因此 respondsToSelector:在运行时判断对歇会儿是否响应此方法。
线程相关
/**
在主线程上执行指定的方法,使用默认的模式(NSDefaultRunLoopMode)
默认的模式指:主线程中的方法进行排队,是一个循环队列,并且循环执行。
这个函数表示在主线程上执行方法,YES表示需要阻塞主线程,直到主线程将我们的代码块执行完毕。
@param aSelector 要在主线程执行的方法,该方法不能有返回值,并且只能有一个参数。
@param arg 要传递的参数,如果无参数,就设为nil。
@param wait 要执行的aSelector方法,是否马上执行。
如果设置为YES:等待当前线程执行完以后,主线程才会执行aSelector方法;
设置为NO:不等待当前线程执行完,就在主线程上执行aSelector方法。
如果,当前线程就是主线程,那么aSelector方法会马上执行。
该方法用途:因为iPhone编程,对UI的修改,只能在主线程上执行。可以用该方法来完成UI的修改。
*/
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait {
NSLog(@"用的多");
}
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array {
}
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait {
}
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array {
}
/**
在当前线程中执行指定的方法,使用默认模式,并指定延迟。
@param aSelector 指定的方法。含义同上,不在赘述。
@param anArgument 同上
@param delay 指定延迟时间(秒)。
*/
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay {
NSLog(@"用的多");
}
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes {
}