访问cocos2d中的实例变量调度方法崩溃

时间:2012-06-16 07:44:25

标签: ios5 cocos2d-iphone

新鲜到objC和cocos2d:)

我正在关注“用iOS5学习cocos2d游戏开发”,在第4章中,有一个“DoodleDrop”游戏。

GameScene.h中定义一些变量

@interface GameScene : CCLayer
{
    CCSprite *player;
    CGPoint playerVelocity;
    CCArray *spiders;
    CGSize screenSize;
    int dropedSpidersCount;
    float duration;
}
    + (CCScene *)scene;
@end
<{1>} GameScene.m init方法如下所示

- (id)init
{
    if (self = [super init]) {
        duration = 4.0;
        [self createPlayer]; 
        [self createSpiders]; // spiders were inited here.
        [self resetSpiders];
        [self schedule:@selector(chooseSpider:) interval:0.7];
    }
    return self;
}

chooseSpider时,我无法访问spiders,xcode破解了

enter image description here

在其他方法中,spidersduration只是表现正常,为什么会发生这种情况?


添加了gist代码

https://gist.github.com/2940466

1 个答案:

答案 0 :(得分:1)

在检查您的代码后,我建议您尝试此修复:

- (void)createSpiders
{
CCSprite *tempSpider = [CCSprite spriteWithFile:@"spider.png"];
CGSize spiderSize = [tempSpider texture].contentSize;
int spiderCount = screenSize.width / spiderSize.width;
spiders = [[CCArray arrayWithCapacity:spiderCount] retain];

for (int i = 0; i < spiderCount; i++) {
    CCSprite *spider = [CCSprite spriteWithFile:@"spider.png"];
    [self addChild:spider];
    [spiders addObject:spider];
}
}

唯一的区别在于:

spiders = [[CCArray arrayWithCapacity:spiderCount] retain];

实际上,如果你没有保留spiders个对象,它将在下一次运行循环迭代时自动释放。

老答案:

如果没有看到更多代码,就无法确切地说出发生了什么,但似乎在创建蜘蛛和chooseSpiders的实际执行之间的间隔中,您的spiders数组将被释放。

快速尝试,我建议添加:

[spiders retain];

之前打电话

    [self schedule:@selector(chooseSpider:) interval:0.7];

然后看到崩溃继续发生。

如果您提供更多代码,则可以进一步帮助您。