iPhone应用程序因未捕获的异常而终止

时间:2009-01-26 10:29:56

标签: iphone objective-c cocos2d-iphone

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是一个倒计时器方法。它的解决方案是什么?

4 个答案:

答案 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];

发生此错误的原因是您没有正确调用计时器,或者您正在使用已取消分配的某个对象。