Завершение работы приложения iPhone из-за необработанного исключения - PullRequest
1 голос
/ 26 января 2009

HI, Я разрабатываю приложение для iPhone с использованием cocos2d. Показано это сообщение.

2009-01-26 16:17:40.603 Find The Nuts[449:20b] *** -[NSCFArray onTimer:]: unrecognized selector sent to instance 0x59be030
2009-01-26 16:17:40.605 Find The Nuts[449:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFArray onTimer:]: unrecognized selector sent to instance 0x59be030'  

здесь onTimer - метод таймера обратного отсчета. какое решение для этого?

Ответы [ 4 ]

4 голосов
/ 26 января 2009

По какой-то причине ваш метод onTimer отправляется экземпляру NSArray. Вполне вероятно, что вы либо случайно отправили его в реальный экземпляр NSArray, либо объект, на который вы действительно пытаетесь отправить его, был освобожден (иначе он больше недоступен) к моменту срабатывания таймера. *

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

3 голосов
/ 15 июня 2009

Нераспознанная ошибка селектора наиболее вероятна, потому что вы передаете неверный текст для параметра @selector. Имена селекторов ДОЛЖНЫ включать атрибуты ':' всякий раз, когда в сигнатуре есть параметр. Итак, если у вас есть метод таймера

-(void) onTimer:(NSTimer*)timer { ... }

Селектер, который вы передаете scheduledTimerWithTimeInterval, должен быть:

@selector(onTimer:)   // note the ':' at the end of the name!

Полный вызов NSTimer будет выглядеть примерно так:

[NSTimer scheduledTimerWithTimeInterval:1 
                                 target:self 
                               selector:@selector(OnTimer:) // note the ':'
                               userInfo:nil
                                repeats:NO];
0 голосов
/ 27 января 2009

Почему метод onTimer вызывается для объекта NSArray? Из вашего описания, я считаю, что onTimer имеет это определение

-(void)onTimer:(NSTimer *)aTimer

В этом случае onTimer - это метод вашего viewcontroller (или другого созданного вами класса), но не метод массива. Как вы вызываете таймер? Правильный способ запустить таймер, который будет вызывать этот метод, это

[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];

Причиной возникновения этой ошибки является то, что вы неправильно вызываете таймер или используете какой-либо объект, который был освобожден.

0 голосов
/ 26 января 2009

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

[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];

- (void)onTimer {
     NSLog(@"hello!"];
}

Может быть, цель освобождается до ее возвращения?

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

objc_exception_throw и - [повышение NSException]. На iPhone я думаю, что все исключения проходят через objc_exception_throw, но если вы нацелены на Mac OS X Tiger или более раннюю версию, вы должны установить точку останова на обоих.

Есть больше методов отладки в http://www.cocoadev.com/index.pl?DebuggingTechniques.

Tony

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