NSInvocation是iOS消息传递跟方法调用的一个类
用处跟performSelector:withObject的作用一样,后者调用一些参数少的消息是比较简便的,对于参数大于2或者有返回值的消息比较麻烦,NSInvocation是不二之选。
NSInvocation的简单用法:
NSInvocation是通过类方法 invocationWithMethodSignature 来创建的,所以必须对方法名进行签名,用方法签名来创建NSInvocation对象;
创建一个Command Line Tool工程,来测试NSInvocation的简单使用
@interface NSInvocationTestClass : NSObject
- (NSString *)testString:(NSString *)string;
@end
@implementation NSInvocationTestClass
- (id)init {
self = [super init];
if (self) {
}
return self;
}
- (NSString *)testString:(NSString *)string {
NSString *aString = [NSString stringWithFormat:@"****%@***",string];
return aString;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSInvocationTestClass *testClass = [[NSInvocationTestClass alloc] init];
NSString *tString = @"Hello World!";
//普通调用
NSString *normalInvokeString = [testClass testString:tString];
NSLog(@"normal invoke string is:%@",normalInvokeString);
// 使用NSInvocation来调用
SEL testSelector = @selector(testString:);
// 方法签名
NSMethodSignature *methodSig = [[testClass class] instanceMethodSignatureForSelector:testSelector];
// 根据方法签名来创建一个NSInvocation
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSig];
// 设置target
[invocation setTarget:testClass];
// 设置selector
[invocation setSelector:testSelector];
// 设置Argument,为什么index是从2开始?因为0被 target,1被selector占用了
[invocation setArgument:&tString atIndex:2];
如果有多个参数,
[invocation setArgument:&***** atIndex:3];
NSString * result = nil;
[invocation retainArguments];
[invocation invoke];
// 获取返回值
[invocation getReturnValue: &result];
NSLog(@"The NSInvocation invoke string is: %@", result);
}
return 0;
}
输出的结果是一样的:
NSInvocationDemo[25694:1262437] normal invoke string is:****Hello World!***
NSInvocationDemo[25694:1262437] The NSInvocation invoke string is: ****Hello World!***
这是NSInvocation 的简单用法,怎么接入到项目中,这就要看实际的需求了。
有兴趣更深入了解NSInvocation的朋友,可以去苹果官方文档查看资料。苹果官方文档