2011-03-07 91 views
3

下面的代码按预期工作:如何从NSInvocation获取NSString结果?

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" 

我已经搜查高有低,但找不出这一点。任何帮助?谢谢!

回答

7

从NSInvocation的类引用:

当参数值是一个对象,将指针传递到可变(或存储器),从该对象应该被复制:

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

由于@”测试“实际上是构建一个NSString的实例,您应该使用

NSString *testString = @"test"; 
[invocation setArgument:&testString atIndex:2]; 
+0

谢谢,谢谢,谢谢!我完全看错了。很长一段时间。 – 2011-03-07 19:47:39