iOS中用三种方式调用方法:
如下的printStr1方法:
- (void)printStr:(NSString*)str{
NSLog(@"printStr %@",str);
}
- 直接调用
[self printStr:@"hello world 1"];
- 使用performSelector:withObject:
[self performSelector:@selector(printStr:) withObject:@"hello world 2"];
- 使用NSMethodSignature&NSInvocation
//获取方法签名
NSMethodSignature *sigOfPrintStr = [self methodSignatureForSelector:@selector(printStr:)];
//获取方法签名对应的invocation
NSInvocation *invocationOfPrintStr = [NSInvocation invocationWithMethodSignature:sigOfPrintStr];
/**
设置消息接受者,与[invocationOfPrintStr setArgument:(__bridge void * _Nonnull)(self) atIndex:0]等价
*/
[invocationOfPrintStr setTarget:self];
/**设置要执行的selector。与[invocationOfPrintStr setArgument:@selector(printStr1:) atIndex:1] 等价*/
[invocationOfPrintStr setSelector:@selector(printStr:)];
//设置参数
NSString *str = @"hello world 3";
[invocationOfPrintStr setArgument:&str atIndex:2];
//开始执行
[invocationOfPrintStr invoke];
NSMethodSignature
NSMethodSignature用于描述method的类型信息:返回值类型,及每个参数的类型。
NSInvocation
NSInvocation对象主要用于存储和转发对象之间和应用程序之间的消息。
NSInvocation对象包含Objective-C消息的所有元素:目标(target),选择器(selector),参数和返回值。
可以直接设置这些元素,并在NSInvocation对象被dispatched时自动设置返回值。
转载自:NSproxy
网友评论