NSInvocation与PerformSelector:的作用是一样的,都是可以直接调用某个对象的消息
异同点
相同点: 有相同的父类NSObject
区别: 在参数个数<= 2的时候performSelector:的使用要简单一些,但是在参数个数 > 2的时候NSInvocation就简单一些
使用
performSelector:的使用相对简单,主要用到以下几个方法
// 判断是否可以调用selector对应的方法
- (BOOL)canPerformAction:(SEL)action withSender:(nullable id)sender;
/* 直接调用的部分 */
// 当没有参数的时候调用的方法
- (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:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
//高级延迟函数
// 最后一个参数是RunLoopModes
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSString *> *)modes
举个例子:
if ([self canPerformAction:@selector(myLog:) withSender:nil]) {
[self performSelector:@selector(myLog:) withObject:@"123" afterDelay:5];
}
- (void)myLog:(NSString*)log{
NSLog(@"MyLog = %@",log);
}
下面主要演示NSInvocation的使用
- (NSString*)textInvocation{
// 函数初始化部分
SEL selector = @selector(myLog:Log2:);
NSMethodSignature *sig = [self methodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
// 设置参数
invocation.target = self;
invocation.selector = selector;
NSString *log = @"我是log";
NSString *log2 = @"我是log2";
[invocation setArgument:&log atIndex:2];
[invocation setArgument:&log2 atIndex:3];
// 设置返回值
NSString *result = nil;
[invocation retainArguments];
[invocation invoke];
[invocation getReturnValue:&result];
return result;
}
- (NSString*)myLog:(NSString*)log Log2:(NSString*)log2{
return [NSString stringWithFormat:@"MyLog==%@,Log2 == %@",log, log2];
}
其中的self可以替换成其他的类,然后相应的myLog:Log2需要替换成其他的类里面的方法
网友评论