我从va_list获取参数时遇到奇怪的问题,它在模拟器上完美运行,当在设备上运行相同的代码(iPhone 6s)时问题就开始了,看起来arm64不支持这个。有什么想法吗?
va_start(arguments, self_);
id arg = va_arg(arguments, id);
// arg is NULL
va_end(arguments);
编辑:
在模拟器上获取正确的arg对象(NSString *)但是当相同的代码在设备(iPhone 6s)上运行时,相同的arg对象始终为NULL。
...^(id self_, SEL cmd_, ....) {
.....
va_list arguments;
va_start(arguments, cmd_);
NSUInteger arg_count = [methodSignature numberOfArguments];
for(NSUInteger i = 0; i < arg_count - 2; i++ ) {
NSUInteger idx = i+2;
const char *type = [methodSignature getArgumentTypeAtIndex:idx];
if (strcmp(@encode(id), type) == 0) {
id arg = va_arg(arguments, id);
[invocation setArgument:&arg atIndex:idx];
}
}
va_end(arguments);
答案 0 :(得分:0)
基本方法由自定义块进行调整,自定义块处理新的实现,其中参数传递varargs:
void (*actionSelectorImplementationBlock) = ^(id self_, ...) {
// ...... Creating Invocation etc....
va_list arguments;
va_start(arguments, self_);
NSUInteger arg_count = [methodSignature numberOfArguments];
for(NSUInteger i = 0; i < arg_count - 2; i++ ) {
NSUInteger idx = i+2;
const char *type = [methodSignature getArgumentTypeAtIndex:idx];
id arg = va_arg(arguments, id);
[invocation setArgument:&arg atIndex:idx];
}
va_end(arguments);
// Invoke NSInvocatin
}
IMP newImplementation = imp_implementationWithBlock(actionSelectorImplementationBlock);
method_setImplementation(originalMethod, newImplementation);
Swizzled方法:
- (void)test:(NSNumber *)t test2:(NSString *)string;