NSInvocation
NSInvocation是一个消息调用类,主要作用是存储和传递消息。它存储的信息包含了一个iOS消息全部的成分:target、selector、参数、返回值、方法签名。
也就是说,NSInvocation可以将传统的iOS消息发送这个过程转换成一个对象,然后执行这个对象的发送消息的方法就可以达到performSelector的效果,NSInvocation对象包含的每一个组成部分能够直接设定(如消息target,参数之类的)。
NSMethodSignature
方法签名NSMethodSignature是一个方法的返回类型和参数类型,不包括方法名称。
创建NSMethodSignture主要是以下两个方法
+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector ;
+ (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;
封装invacation可以调用多个参数的方法
//
-(void)invacation
{
//1.创建一个MethodSignature,签名中保存了方法的名称,参数和返回值
//这个方法属于谁,那么就用谁来进行创建
//注意:签名一般是用来设置参数和获得返回值的,和方法的调用没有太大的关系
// NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(callWithNumber:andContext:withStatus:)];
NSMethodSignature *signature = [self methodSignatureForSelector:@selector(callWithNumber:andContext:withStatus:)];
//NSInvocation中保存了方法所属于的对象|方法名称|参数|返回值等等
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
/*2.1 设置invocation,来调用方法*/
invocation.target = self;
invocation.selector = @selector(callWithNumber:andContext:withStatus:);
NSString *number = @"10086";
NSString *context = @"下课了";
NSString *status = @"睡觉的时候";
//注意:
//1.自定义的参数索引从2开始,0和1已经被self and _cmd占用了
//2.方法签名中保存的方法名称必须和调用的名称一致
[invocation setArgument:&number atIndex:2];
[invocation setArgument:&context atIndex:3];
[invocation setArgument:&status atIndex:4];
/*3.调用invok方法来执行*/
[invocation invoke];
}
- (void)callWithNumber:(NSString *)number andContext:(NSString *)context withStatus:(NSString *)status{
NSLog(@"number=%@ context=%@ status=%@",number,context,status);
}
网友评论