Ios5 访问cocos2d计划方法中的实例变量时崩溃

Ios5 访问cocos2d计划方法中的实例变量时崩溃,ios5,cocos2d-iphone,Ios5,Cocos2d Iphone,新鲜至objC和cocos2d:) 我正在学习“用iOS5学习cocos2d游戏开发”,在第4章中,有一个“DoodleDrop”游戏 在gamesene.h中定义一些变量,如下所示 @interface GameScene : CCLayer { CCSprite *player; CGPoint playerVelocity; CCArray *spiders; CGSize screenSize; int dropedSpidersCount;

新鲜至objC和cocos2d:)

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

gamesene.h
中定义一些变量,如下所示

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

@interface GameScene : CCLayer
{
    CCSprite *player;
    CGPoint playerVelocity;
    CCArray *spiders;
    CGSize screenSize;
    int dropedSpidersCount;
    float duration;
}
    + (CCScene *)scene;
@end
- (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
中,我无法访问
spider
,xcode中断

在其他方法中,
spider
duration
只是正常运行,为什么会发生这种情况


添加了要点代码


检查代码后,我建议您尝试以下修复:

- (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];
}
}
实际上,如果您没有保留
spider
对象,它将在下一次运行循环迭代时自动删除

旧答案:

如果看不到更多的代码,就不可能准确地说出发生了什么,但是在创建spider和实际执行
choosespider
之间的时间间隔内,您的
spider
数组将被释放

作为快速尝试,我建议添加:

[spiders retain];
打电话之前

    [self schedule:@selector(chooseSpider:) interval:0.7];
看看坠机是否继续发生


如果您提供更多的代码,就有可能进一步帮助您。

在您第一次调用chooseSpider时,这种情况已经发生了吗?你能发布
createspider
code吗?@sergio刚刚在[self schedule:…]之前登录,
spider
正常<代码>NSLog(@“%d”,[spider count])输出为10。在书中,spider数组是alloc'd&init'd:spider=[[CCArray alloc]initWithCapacity:spiderCount];顺便说一句,spider是GameSecene类的一个实例变量,而不是全局变量。@learncos2D感谢您的解释。你是对的,我错过了一些东西。谢谢@sergio,它又崩溃了:(gist中提供了更多的代码。你的意思是
下一次运行循环
?我可以将爬行器设置为这样的属性吗
@属性(非原子,保留)CCSprite*spiders
因此我可以忽略
CCArray
init中的
retain
部分?是的,如果您分配throu:self.spiders=[CCArray…],您可以定义一个retain属性并明确保留retain;至于运行循环迭代,当autorelease池可能为空时。。。