NSInvocation setArgument不能使用简单的int32_t

时间:2013-02-20 16:53:16

标签: objective-c integer nsinvocation

我在使用带有不是对象的参数的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作为参数类型。

请有人帮忙吗? 感谢....

2 个答案:

答案 0 :(得分:5)

您传递的是错误的参数类型。由于该方法采用类型为int32_t的参数,因此您需要传递:

int32_t arg = 123456;

[inv setArgument:&arg atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation

答案 1 :(得分:0)

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

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