与sprite数组访问不良

时间:2013-04-02 19:06:42

标签: cocos2d-iphone nsmutablearray exc-bad-access

我使用CCSprites填充NSMutableArray并将它们添加到添加到场景的当前图层。当我尝试访问数组的元素时,我得到一个错误的访问错误

sprites = [[[NSMutableArray alloc] init]autorelease];

    int j = 0;

    for (int i=0; i<[sprites count]; i++)
    {
        j=i+1;
        sprite = [CCSprite spriteWithFile:[NSString stringWithFormat:@"intro%d.png",j]];
        sprite.position = ccp(WIDTH/2, HEIGHT/2+(i*HEIGHT));
        [sprites addObject:sprite];

    }

    for (int i = 0; i<[sprites count]; i++)
    {
        [self addChild:[sprites objectAtIndex:i]];
    }


    [self scheduleUpdate];


}
return self;

这是在init方法中完成的,sprite和sprite是在头文件中声明的。在更新方法中,我有

sprite = [sprites objectAtIndex:1];
sprite.position = ccpAdd(sprite.position, ccp(0,dy));
CCSprite* spr = [sprites objectAtIndex:2];
spr.position = ccpAdd(spr.position, ccp(0,dy));

当控制权传递给更新方法时,我获得了错误的访问权限。如果有人能帮助我,我会很高兴

3 个答案:

答案 0 :(得分:0)

你应该保留sprite数组(确保你在对象的dealloc中释放它)。由于它是可自动释放的,因此在从init到update方法的循环中,它会被释放。

另外(奇怪),如果您的代码如图所示,当您开始第一个循环时,sprites.count为0。你不会在那里得到太多:)。

答案 1 :(得分:0)

发生这种情况是因为您创建了一个自动释放对象,然后您尝试稍后在更新代码中访问该对象。精灵数组的保留计数为零(因为它是自动释放),并且取消分配,然后尝试访问它,并获得错误访问错误。

要修复,你应该使sprite数组成为自动释放对象。由于您计划稍后在代码中使用该对象,因此应保留该对象(不添加自动释放)。您还应该确保在(无论是在数组上运行的父对象)的dealloc方法中释放数组。

- ( void ) dealloc {
   [ sprites release ];
   [ super dealloc ];
}

答案 2 :(得分:0)

其他是正确的(autorelease调用是罪魁祸首 - 你应该删除它,然后在场景的dealloc方法中释放数组。)

另请注意,[[[NSMutableArray alloc] init]autorelease][NSMutableArray array]具有相同的效果(但对于您的方案,这不是您所需要的)。