从arm64,Xcode上的va_list中获取参数

时间:2016-02-18 10:58:03

标签: ios objective-c xcode 64-bit

我从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);

1 个答案:

答案 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;