3

У меня есть настоящий головной уборщик прямо сейчас. Итак, объект NSTimer, объект NSMethodSignature и объект NSInvocation входят в панель. Вот остальная часть анекдота:Почему это 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:]: method signature argument cannot be nil

Edit: Я не знаю, почему кто-то подумал, что надо было вниз голосовать мой вопрос. Извините за попытку узнать что-то новое. Собственно, вот поправка к моему первоначальному вопросу: что я должен делать по-другому? Должен ли я просто удалить сообщение, как только выясню, в чем была моя проблема? Я попытался выполнить все этикетки переполнения стека, и я даже потратил время, чтобы оставить ответ вовремя, чтобы он помог кому-то другому. В следующий раз, должен ли я просто вернуться к моему вопросу и оставить ответ вроде: «nvm ... понял это. Thx?» Или я должен просто оставить его здесь, без ответа? Я уверен, что, черт возьми, знаю, что мне надоело нажимать на ссылки только для того, чтобы их приводили в неотвеченные сообщения.

ответ

7

Ой. Я прыгнул с пистолета. Завершение кода Xcode означало, что methodSignatureForSelector: был методом класса NSMethodSignature. Всякий раз, когда я занимаюсь классами, я обычно не общаюсь с ними регулярно, я обычно начинаю с ввода [NSClassImUnfamiliarWith, за которым следует пробел. Это вызывает всплывающее окно завершения кода Xcode, которое обычно имеет все методы, которые можно вызвать. Я случайно выбрал унаследованный (?) Метод от NSObject, считая, что это метод класса. Наверное, это был бы пример полиморфизма. Во всяком случае, я решил проблему, заменив NSMethodSignature моим объектом: tabViewItem.view. Таким образом, все вместе это выглядит следующим образом:

NSMethodSignature *methodSig = [tabViewItem.view methodSignatureForSelector:@selector(setAlphaValue:)]; 

Я не знаю, поможет ли это кому-либо еще, но ей-богу, я буду после этого на всякий случай. Удачи!

+1

Такая же проблема здесь через год. Спасибо за сообщение! –

+1

@Jugale: Я сказал себе в ноябре прошлого года, что если мои неудачи могут спасти только одного человека от продувки дыры на их компьютере, я бы счел это победой. Ты только что получил меня! Я рад, что смогу помочь. Удачи! –

+0

Решила ошибку для меня. Благодаря! –