NSInvocation; переменная не является CFString - PullRequest
1 голос
/ 21 февраля 2011

Я делаю динамический вызов, используя NSInvocation:

NSInvocation *lNSInvocation = [NSInvocation invocationWithMethodSignature: [lListener methodSignatureForSelector:lSelector]];
[lNSInvocation setTarget:lListener];
[lNSInvocation setSelector:lSelector];
// Note: Indexes 0 and 1 correspond to the implicit arguments self and _cmd, which are set using setTarget and setSelector.
[lNSInvocation setArgument:object atIndex:2];
[lNSInvocation setArgument:object2 atIndex:3];
[lNSInvocation setArgument:object3 atIndex:4];
[lNSInvocation invoke];

В отладчике все три объектные переменные правильно указывают на три разных NSCFString *. Вызов выполнен, и с другой стороны достигнут правильный метод.

- (void)login:(NSString*)username password:(NSString*)password host:(NSString*)host

Однако в отладчике его параметры выдают ошибку: «переменная не является CFString». Еще хуже; все три переменные указывают на одну и ту же ячейку памяти.

Как это может быть?

1 Ответ

2 голосов
/ 21 февраля 2011

Если аргументы метода являются объектами, -setArgument:atIndex: ожидает указатель на переменную, из которой объект может быть скопирован.Следовательно, если ваши строки:

NSString *object = @"…";
NSString *object2 = @"…";
NSString *object3 = @"…";

, вы должны написать:

[lNSInvocation setArgument:&object atIndex:2];
[lNSInvocation setArgument:&object2 atIndex:3];
[lNSInvocation setArgument:&object3 atIndex:4];

(обратите внимание на амперсанд перед каждым аргументом объекта)

...