HI, 我正在使用cocos2d开发一个iphone应用程序。它显示了这个消息。
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是一个倒计时器方法。它的解决方案是什么?
答案 0 :(得分:4)
由于某种原因,您的onTimer方法正被发送到NSArray的实例。很可能你不小心将它发送到NSArray的真实实例,或者你正在尝试发送它的对象在计时器实际触发时已经被释放(也就是说,不再可访问)。
我会尝试进行一些内存调试,以确定您的计时器目标是否在不适当的时间发布。如果一切正常,请确认您确实将计时器目标设置为正确的对象。
答案 1 :(得分:3)
无法识别的选择器错误很可能是因为您为@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];
答案 2 :(得分:0)
听起来你没有为定时器提供一个有效的方法来在完成倒计时时调用。您需要将方法选择器和目标都设置为有效对象。见下面的例子:
[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
- (void)onTimer {
NSLog(@"hello!"];
}
也许目标在返回之前被释放了?
此外,您可以尝试添加以下断点,这些断点将在异常发生时进行陷阱。
objc_exception_throw和 - [NSException raise]。在iPhone上我认为所有异常都是通过objc_exception_throw进行的,但如果您的目标是Mac OS X Tiger或更早版本,则应在两者上设置断点。
http://www.cocoadev.com/index.pl?DebuggingTechniques有更多调试技巧。
贝
答案 3 :(得分:0)
为什么在NSArray对象上调用onTimer方法?根据您的描述,我相信onTimer有这个定义
-(void)onTimer:(NSTimer *)aTimer
在这种情况下,onTimer是viewcontroller(或您创建的另一个类)的方法,但不是数组的方法。你是怎么调用计时器的?启动调用此方法的计时器的正确方法是
[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
发生此错误的原因是您没有正确调用计时器,或者您正在使用已取消分配的某个对象。