在利用NSInvocation对方法进行包装时遇到了一点小坑。我们平时再做开发时可以利用NSInvocation对象对我们的方法进行一次包装回调。
<span style="font-size:18px;">//方法签名(方法的描述)
NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];</span>
<span style="font-size:18px;">//利用一个NSInvocation对象包装一次方法调用(方法调用者、方法名、方法的参数、方法返回值)
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
invocation.target = self;//回调对象
invocation.selector = selector;//回调方法</span>
重点是在对NSInvocation对象在进行参数设置时遇到了大坑。NSInvocation对象的setArgument: atIndex: 方法在设置参数是atIndex的0和1已经被系统占用所以我们最多只能从2开始指定包装方法的参数值和对应的参数索引。[invocation setArgument:&object atIndex:i + 2];
//调用方法
[invocation invoke];
如果包装发方法有返回值可以在方法签名中获取。可以更具signature.methodReturnLength返回值的长度来确定包装方法返回值的类型。也可以使用 signature.methodReturnType来获取包装方法的放回类型。
获取返回值:[invocation getReturnValue:&returnValue];