Почему эта NSInvocation вызывает исключение?
У меня сейчас настоящий головной убор. Итак, NSTimer
объект, NSMethodSignature
объект и NSInvocation
Объект зайти в бар. Вот остальная часть шутки:
NSMethodSignature *methodSig = [NSMethodSignature methodSignatureForSelector:@selector(setAlphaValue:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSig];
CGFloat alphaVal = 1.f;
[inv setSelector:@selector(setAlphaValue:)];
[inv setTarget:tabViewItem.view];
[inv setArgument:&alphaVal atIndex:2];
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.5f invocation:inv repeats:NO];
Вот что я получаю в консоли отладки:
+ [NSInvocation _invocationWithMethodSignature: frame:]: аргумент сигнатуры метода не может быть равен нулю
Редактировать: я не уверен, почему кто-то думал, что необходимо было отказаться от голосования на мой вопрос. Извините за попытку узнать что-то новое. На самом деле, вот поправка к моему первоначальному вопросу: что я должен был сделать по-другому? Должен ли я просто удалить пост, как только выяснил, в чем моя проблема? Я пытался следовать всему этикету переполнения стека, и я даже нашел время, чтобы оставить ответ на случай, что он может помочь кому-то еще. В следующий раз, должен ли я просто вернуться к своему вопросу и оставить ответ типа "nvm... понял это. Thx?" Или я должен просто оставить это здесь без ответа? Я уверен, что, черт возьми, я устала нажимать на ссылки только для того, чтобы вести к постам без ответа.
1 ответ
К сожалению. Я бросил пистолет. Завершение кода Xcode заставило меня думать, что methodSignatureForSelector:
был метод класса NSMethodSignature
, Всякий раз, когда я имею дело с классами, с которыми я обычно не связываюсь на регулярной основе, я обычно начинаю с ввода [NSClassImUnfamiliarWith
, сопровождаемый пробелом. Это вызывает всплывающее окно завершения кода Xcode, в котором обычно есть все методы, которые можно вызвать. Я случайно выбрал унаследованный (?) Метод из NSObject
думая, что это был метод класса. Я предполагаю, что это будет примером полиморфизма. Во всяком случае, я решил свою проблему, заменив NSMethodSignature
с моим объектом: tabViewItem.view
, Так что все вместе это выглядит так:
NSMethodSignature *methodSig = [tabViewItem.view methodSignatureForSelector:@selector(setAlphaValue:)];
Я не знаю, поможет ли это кому-нибудь еще, но, черт возьми, я отправлю это на всякий случай. Удачи!