最近在开源项目中看到NSInvocation这个类,赶紧充电
调研了一下,发现在iOS开发中,可以直接调用方法(SEL)的方式有两种performSelector:withObject:
和 NSInvocation
但是前者只能传一个参数,
NSInvocation
是一个消息调用类,它包含了所有OC消息的成分:target
、selector
、参数以及返回值。NSInvocation
可以将消息转换成一个对象,消息的每一个参数能够直接设定,而且当一个NSInvocation
对象调度时返回值是可以自己设定的。一个NSInvocation
对象能够重复的调度不同的目标(target),而且它的selector
也能够设置为另外一个方法签名。NSInvocation
遵守NSCoding
协议,但是仅支持NSPortCoder
编码,不支持归档型操作。
给你一段代码,自己体会
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 80, 45)];
UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(100, 200, 80, 45)];
[self.view addSubview:btn];
[self.view addSubview:btn2];
SEL method = @selector(setBackgroundColor:);
//创建一个函数签名,这个签名可以是任意的,但需要注意,签名函数的参数数量要和调用的一致。
// NSMethodSignature *sig = [UIButton instanceMethodSignatureForSelector:method];
//通过签名初始化
// NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIButton instanceMethodSignatureForSelector:method]];
[invocation setSelector:method];
UIColor *color = [UIColor blueColor];
// 传参
// 这里设置参数的Index 需要从2开始,因为前两个被selector和target占用
[invocation setArgument:&color atIndex:2];
// //设置 调用对象
[invocation invokeWithTarget:btn];
[invocation invokeWithTarget:btn2];
}
网友评论