3

以下代码按预期工作:

NSLog(@"%@", [NSString stringWithString:@"test"]; // Logs "test"

但是当我用 替换它时NSInvocation,我得到了完全不同的结果:

Class class = [NSString class];
SEL selector = @selector(stringWithString:);

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
                          [class methodSignatureForSelector:selector]];
[invocation setTarget:class];
[invocation setSelector:selector];
[invocation setArgument:@"test" atIndex:2];
[invocation invoke];

id returnValue = nil;
[invocation getReturnValue:&returnValue];
NSLog(@"%@", returnValue); // Logs "NSCFString"

我已经搜索了高低,但无法弄清楚这一点。有什么帮助吗?谢谢!

4

1 回答 1

7

从 NSInvocation 类参考:

当参数值是一个对象时,传递一个指向应该从中复制对象的变量(或内存)的指针:

NSArray *anArray;    
[invocation setArgument:&anArray atIndex:3];

由于@"test" 实际上是在构造一个 NSString 的实例,你应该使用

NSString *testString = @"test";
[invocation setArgument:&testString atIndex:2];
于 2011-03-07T19:45:35.173 回答