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

int_32t ではなく、NSNumber* を引数として渡しています。NSNumber はたまたま整数をラップしていますが、整数ではありません。

retainArguments引数は保持できるオブジェクトであると予想される場合があることに注意してください。そのドキュメントには、C 文字列がコピーされると記載されていますが、int などのスカラーに何が起こるかはすぐにはわかりません。retainArgumentsおそらく、自分自身を保持したり解放したりすることは避け、管理する必要があります。

于 2013-02-20T17:30:28.987 に答える