【问题标题】:CCSprite initializer causes crash with no exception or errorCCSprite 初始化程序导致崩溃,没有异常或错误
【发布时间】:2010-07-31 03:20:38
【问题描述】:

我正在创建一个自定义CCSprite 类来显示自定义图像并设置其自己的位置以及处理其他绘图任务。目前,除了初始化程序之外,我没有在自定义类中运行其他代码,它应该设置图像文件和精灵的位置。这是我的- (id)init 方法

- (id)init 
{
    if (!(self = [super initWithFile:@"runnerImage.png"]))
        return nil;
    //set our texture to the runner image ^^^
    //set our initial position
    CGSize size = [[CCDirector sharedDirector] winSize];
    self.position = CGPointMake(size.width/2, size.height-RUNNER_OFFSET); //centered x and offseted by RUNNER_OFFSET
    return self;
}

目前,应用程序在运行此代码后崩溃。 (我已经通过断点和注释行来确定这一点。)知道为什么吗?这是我调用它的部分:

myRunner = [[Runner alloc] init];
[self addChild:myRunner];   
//schedule an update each frame

这是在 CCLayer 子类的 - init 方法中。

这是控制台日志:

2010-07-31 09:16:32.730
CubeRacer[849:207] cocos2d: cocos2d
v0.99.4-rc2 2010-07-31 09:16:32.733
CubeRacer[849:207] cocos2d:使用
导演类型:CCDisplayLinkDirector
2010-07-31 09:16:33.064
CubeRacer[849:207] cocos2d: GL_VENDOR:
苹果电脑公司 2010-07-31
09:16:33.065 CubeRacer[849:207]
cocos2d: GL_RENDERER: 苹果软件
渲染器 2010-07-31 09:16:33.065
CubeRacer[849:207] cocos2d:
GL_VERSION:OpenGL ES-CM 1.1 APPLE
2010-07-31 09:16:33.066
CubeRacer[849:207] cocos2d:
GL_MAX_TEXTURE_SIZE: 2048 2010-07-31
09:16:33.067 CubeRacer[849:207]
cocos2d:GL_MAX_MODELVIEW_STACK_DEPTH:
16 2010-07-31 09:16:33.068
CubeRacer[849:207] cocos2d: GL
支持 PVRTC:是 2010-07-31
09:16:33.068 CubeRacer[849:207]
cocos2d:GL 支持 BGRA8888
纹理:否 2010-07-31 09:16:33.071
CubeRacer[849:207] cocos2d: GL
支持 NPOT 纹理:是 2010-07-31
09:16:33.072 CubeRacer[849:207]
cocos2d:GL 支持
丢弃帧缓冲区:是 2010-07-31
09:16:33.072 CubeRacer[849:207]
cocos2d:使用 NPOT 支持编译:
否 2010-07-31 09:16:33.073
CubeRacer[849:207] cocos2d:已编译
在 TextureAtlas 中支持 VBO:是
2010-07-31 09:16:33.074
CubeRacer[849:207] cocos2d:已编译
使用仿射矩阵变换
CCNode:是 2010-07-31 09:16:33.074
CubeRacer[849:207] cocos2d:已编译
具有分析支持:无程序
接收到的信号:“EXC_BAD_ACCESS”。

感谢您的帮助!

更新 经过更多研究后,我发现这可能是一个循环问题,但我不确定。 我正在调用的超类初始化程序调用[self init]。这会调用我的子类或CCSprite 类的- (id)init 方法吗?如果它调用我的子类,那么这就是明显的问题。查看我的评论以获取我发现的讨论的链接。

【问题讨论】:

  • 我发现了这个问题的另一个描述,说这是一个循环问题。显然,CCSprite 的超级初始化程序再次调用 [self init],如果我是对的,调用我的子类初始化程序。这会导致问题正确吗?

标签: iphone objective-c cocoa cocoa-touch cocos2d-iphone


【解决方案1】:

我认为你的问题是你的方法是指定的初始化程序 -(id) init 然后你在其中调用 [super initWithFile:..] ,然后调用 -(id) init。现在,因为您在实现中覆盖了 -(id) init,所以您的版本会被调用,并且您将有一个无限循环。

据我了解。在 -(id) init 方法中调用除 [super init] 以外的超级方法绝对是个坏主意。相反,将您的 -(id) init 方法重命名为 -(id) initWithRunnerImage 就可以了。

Apple 文档提供了更多示例: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocAllocInit.html#//apple_ref/doc/uid/TP30001163-CH22-SW8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多