3

The following code works as expected:

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

But when I replace it with an NSInvocation, I get a totally different result:

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"

I've searched high and low, but cannot figure this out. Any help? Thanks!

Hilton Campbell
  • 6,065
  • 3
  • 47
  • 79

1 Answers1

7

From the NSInvocation class reference:

When the argument value is an object, pass a pointer to the variable (or memory) from which the object should be copied:

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

Since @"test" is actually constructing an instance of NSString, you should use

NSString *testString = @"test";
[invocation setArgument:&testString atIndex:2];
Stephen Poletto
  • 3,645
  • 24
  • 24