performSelector: withObject:参数为基本数据类型(亲测有效)

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类


image.png
  • 这里我们可以先利用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];

  • 完整代码如下:


    image.png
  • 控制台输出结果

------收到传递的值为:10

你可能感兴趣的:(performSelector: withObject:参数为基本数据类型(亲测有效))