Как я могу получить результат NSString из NSInvocation?

Следующий код работает, как и ожидалось:

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"

Я искал вверх и вниз, но не могу понять это. Любая помощь? Спасибо!


person Hilton Campbell    schedule 07.03.2011    source источник


Ответы (1)


Из ссылки на класс NSInvocation:

Когда значением аргумента является объект, передайте указатель на переменную (или память), из которой должен быть скопирован объект:

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

Поскольку @"test" фактически создает экземпляр NSString, вы должны использовать

NSString *testString = @"test";
[invocation setArgument:&testString atIndex:2];
person Stephen Poletto    schedule 07.03.2011
comment
Спасибо Спасибо спасибо! Я вообще смотрел не на то. Очень давно. - person Hilton Campbell; 07.03.2011