在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocation.
第一个PerformaceSelector比较常用, 也比较简单。 但是这个方式最多只能传递2个参数 当需要2个以上参数时就只能用NSInvocation了 直接上代码吧, 会注释清楚 - (void)viewDidLoad { [super viewDidLoad]; //用performanceSelector调用三个参数的方法, 但只传递2个参数, 这样方法的第三个参数会自动取我们传的第二个的值 [self performSelector:@selector(printStr1:Str2:Str3:) withObject:@"str1" withObject:@"str2"]; //1.创建方法签名 NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(printStr1:Str2:Str3:)]; //2.根据方法签名来创建NSInvocation对象, 在这之前最好先判断下前面创建的signature是否为nil, 方法不存时就是nil NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; //设置方法的调用者 invocation.target = self; //设置方法名, 这里一定要跟方法签名类中的方法名一致 invocation.selector = @selector(printStr1:Str2:Str3:); //自定义三个参数 NSString *str1 = @"First argument"; NSString *str2 = @"Second argument"; NSString *str3 = @"Third argument"; //从第二个位置开始添加参数, 因为前面两个位置已经被占用了, 分别时self(target), selector(_cmd) [invocation setArgument:&str1 atIndex:2]; [invocation setArgument:&str2 atIndex:3]; [invocation setArgument:&str3 atIndex:4]; //3.调用invoke方法 [invocation invoke]; } - (void)printStr1:(NSString *)str1 Str2:(NSString *)str2 Str3:(NSString *)str3 { NSLog(@"%@", str1); NSLog(@"%@", str2); NSLog(@"%@", str3); } @end 输出结果为: 2017-01-06 11:55:07.398 BezierPathDemo[1203:97184] str1 2017-01-06 11:55:07.398 BezierPathDemo[1203:97184] str2 2017-01-06 11:55:07.399 BezierPathDemo[1203:97184] str2 2017-01-06 11:55:07.399 BezierPathDemo[1203:97184] First argument 2017-01-06 11:55:07.399 BezierPathDemo[1203:97184] Second argument 2017-01-06 11:55:07.399 BezierPathDemo[1203:97184] Third argument
NSInvocation使用时有下面三个地方要注意下 1、如果调用的方法不存在
2、方法的参数个数与外界传进来的参数数组元素个数不符
3、判断当前调用的方法是否有返回值
|
请发表评论