2

在将 NSInvocation 与不是对象的参数一起使用时,我遇到了一个问题。我传递的简单整数值被更改为不同的值。

这是我正在调用的方法:

+(NSString*) TestMethod2 :(int32_t) number
{
    NSLog(@"*************** %d ******************", number);
    return @"success";
}

这就是我所说的:

-(void) TestInvocationUsingReflection
{
    id testClass = NSClassFromString(@"TestClass");
    NSMethodSignature * methodSignature = [testClass methodSignatureForSelector:@selector(TestMethod2:)];

    NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSignature];
    [inv setSelector:@selector(TestMethod2:)];
    [inv setTarget:testClass];
    NSNumber * arg = [NSNumber numberWithInt:123456];

    [inv setArgument:&arg atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
    [inv retainArguments];
    NSUInteger length = [[inv methodSignature] methodReturnLength];
    id result = (void *)malloc(length);

    [inv invoke];
    [inv getReturnValue:&result];

}

结果是记录的不是我传递的简单的 123456 值,而是这样的:

** * ***180774176** * ** * ***

我做错了什么?

我对 Objective C 很陌生,但是我需要在运行时调用一个我无法控制的方法。它以 int64_t 作为参数类型。

请问有人可以帮忙吗?谢谢....

4

2 回答 2

6

您传递了错误的参数类型。由于该方法采用 type 的参数int32_t,这就是您需要传递的内容:

int32_t arg = 123456;

[inv setArgument:&arg atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
于 2013-02-20T17:29:32.973 回答
1

您将 NSNumber* 作为参数传递,而不是 int_32t。NSNumber 恰好包装了整数,但它不是整数。

请注意,retainArguments可能期望参数是可以保留的对象。它的文档确实提到了 C 字符串是被复制的,但是像 int 这样的标量会发生什么并不是很明显。您可能应该避免retainArguments并管理保留和释放自己。

于 2013-02-20T17:30:28.987 回答