每当调用空方法时,应用程序崩溃

时间:2013-01-12 20:14:11

标签: objective-c cocos2d-iphone

所以我使用cocos2d在Xcode 3.2.4中编写游戏,然后我创建了一个名为player的类。截至目前,它只有一个无效的功能。

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface Player : CCSprite {

}

-(void)leftButtonPressed;

@end 



#import "Player.h"


@implementation Player

- (id)init{
    if((self=[super init])){
        self = [CCSprite spriteWithFile:@"playerPlane.png"];
        }
    return self;
}

-(void)leftButtonPressed{
}

@end `

每当我尝试从任何地方调用leftButtonPressed时,整个应用程序都会在控制台中崩溃

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CCSprite leftButtonPressed]: unrecognized selector sent to instance 0x6e4bb50'

我通过执行将Player初始化为另一个类中的实例 Player * thePlayer = [[Player alloc]init];

请帮忙!谢谢!

2 个答案:

答案 0 :(得分:3)

这会导致问题:

- (id)init{
    if((self=[super init])){
        self = [CCSprite spriteWithFile:@"playerPlane.png"];
        }
    return self;
}
你正在做什么?您初始化新创建的(调用alloc / init创建它的调用者)Player对象。 init方法甚至可能返回了另一个实例而不是当前正在执行的实例(一些奇怪的独特可可事物)。如果成功,那么您将创建一个新的CCSprite对象并将其分配给self。然后将Self返回给调用者。 (如果你不是ARC - 我假设你这样做 - 那么这肯定会造成内存泄漏);

但调用者希望处理Player对象,然后将leftButtonPressed消息发送给CCSprite无法响应的消息。

即错误消息告诉您的内容。

您可以改用:

- (id)initSpriteWithFile(NSString*)fileName{
    if((self=[super initSpriteWithFile:fileName])){
        // Do any additional setup here. If you don't have any setup then do not overwrit the init method at all. 
        }
    return self;
}

或类似的东西:

- (id)init{
    if((self=[super init])){
        [self setFileName:@"playerPlane.png"]; //This method may not exist at all but you may find an appropriate one in the docs. I am not used to CCSprit. I am just trying to explain the concept by example. 
        }
    return self;
}

答案 1 :(得分:0)

您正在呼叫self = [CCSprite spriteWithFile:@"playerPlane.png"];,但这会创建CCSprite个实例而不是Player个实例。

我猜你没有CCSprite的来源,或者没有非工厂的初始化程序?

在这种情况下,您最好创建一个类扩展而不是子类化。