performSelector: withObject:基本用法
[self performSelector:@selector(test)];
[self performSelector:@selector(test:) withObject:@"测试"];
[self performSelector:@selector(test:) withObject:@"测试" afterDelay:1.0];
当调用的方法参数为基本数据类型时,如:
-(void)test:(NSInteger)count
这个时候如果你这样调用的话的不会成功的
NSNumber *num = [NSNumber numberWithInt:2];
[self performSelector:@selector(test:) withObject:num];
//或
[self performSelector:@selector(test:) withObject:@2];
控制台打印结果:
------收到传递的值为:-7964262576567589500
有木有发现你传的是int 2,收到的是负数,封装成NSNumber对象也不行
那么我们到底要怎么做才能通过调用performSelector: withObject:实现基本数据类型传递呢?
我们先看看系统提供的NSInvocation类
- 这里我们可以先利用NSSelectorFromString将字符串反射成SEL方法
- 利用NSInvocation再进行封装
SEL aSelector = NSSelectorFromString(@"test:");
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:aSelector]];
- NSInvocation类可以设置SEL属性
@property SEL selector;
将反射后的SEL设置给inv
[inv setSelector:aSelector];
- 封装参数
NSInteger paramType = 10;
[inv setArgument:&(paramType) atIndex:2];
-
完整代码如下:
控制台输出结果
------收到传递的值为:10