注意:
读者看到@selector(…)语句的时候可能会觉得有些陌生,这在Objective-C中用来指定某个特定方法。关键在于,决不能忘记上述示例中updateTenTimesPerSecond后面的冒号!该冒号告诉Objective-C:“去找一个名为updateTenTimesPerSecond的方法,这个方法有且只有一个参数。”如果忘记写冒号,编译还是可以通过的,但是程序一运行就会发生崩溃。在Debugger Console窗口中,你会看到这样的错误日志:“unrecognized selector sent to instance…”。
@selector(…)中的冒号数一定要与所指定方法的参数个数相同。假设有下述方法:
-(void) example:(ccTime)delta sender:(id)sender flag:(bool)aBool
那么,对应的@selector语句就应该是:
@selector(example:sender:flag:)
不论是在调度消息时还是在其他情况下使用@selector(…),都需要注意一个很重要的问题:在默认情况下,如果方法名不存在,编译器并不会报错;但是,一旦程序运行时调用了指向不存在方法的aselector语句,应用程序就会立即崩溃。由于这个调用是在cocos2d内部完成的,因此很难找到问题所在。好在,你可以做一些设置来强制编译器报错。图3-3显示的是设置强制报错的界面。本章的“Essentials”Xcode项目也已经做了相同设置。