2

我正在使用 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 方法中完成的,并且 sprites 和 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));

当控制权传递给更新方法时,我的访问权限不好。如果有人可以帮助我,我会很高兴

4

3 回答 3

0

您应该保留 sprites 数组(确保在对象的 dealloc 中释放它)。由于它是可自动发布的,因此在从您的 init 到您的更新方法的周期中,它会被释放。

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

于 2013-04-02T19:24:33.317 回答
0

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

要解决此问题,您不应sprites 数组设为自动释放对象。由于您计划稍后在代码中使用该对象,因此您应该保留它(通过不添加自动释放)。然后,您还应该确保在(无论在数组上操作的父对象)的 dealloc 方法中释放数组。

- ( void ) dealloc {
   [ sprites release ];
   [ super dealloc ];
}
于 2013-04-02T21:36:00.450 回答
0

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

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

于 2013-04-03T03:59:15.437 回答