NSInvocation setSelector вызывает исключение - PullRequest
0 голосов
/ 16 июня 2011

У меня есть следующий код, который я тестирую:

NSString * parameterSignature = @"@:";
NSMethodSignature * signature = [NSMethodSignature signatureWithObjCTypes:[parameterSignature UTF8String]]; 
NSInvocation * invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:@selector(aMethodWithNoParms)];

Когда выполняется setSelector, я получаю эту ошибку:

Name: NSInvalidArgumentException
File: Unknown
Line: Unknown
Reason: -[NSInvocation setArgument:atIndex:]: index (1) out of bounds [-1, 0]

Я троллю сеть в поискахпричина, по которой так и не нашел его.Похоже, что он пытается установить второй параметр вызова, который будет селектором, но массив не достаточно длинный.Я бы подумал, что создание вызова настроило бы массив.

Я не уверен, как это исправить, кто-нибудь увидит, что я сделал неправильно?

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

Если ваш метод ничего не возвращает, т. Е. Имеет тип возврата void, тогда сигнатура вашего метода будет

NSString * parameterSignature = @"v@:";

указывает void тип возврата, self и _cmd.

Желательно использовать methodSignatureForSelector: или instanceMethodSignatureForSelector: для получения сигнатуры метода.

3 голосов
/ 16 июня 2011

Я думаю, что первым символом строки C должен быть тип возвращаемого значения.Поэтому должно быть

"@@:"

, если метод возвращает объект.Ваша строка определяет метод с типом возвращаемого объекта и одним параметром, который является селектором.На самом деле, как минимум, вам нужен тип возврата, тип получателя и тип селектора.

См. это обсуждение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...