NSMutableArray的sprite,内存问题?

时间:2011-06-14 02:29:41

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

我有十个精灵的阵列;他们都坐在屏幕的同一区域为了便于解释,我会说在底部中间,堆叠在一起。我需要做的是将顶级精灵通过向前滑动(从下到上)将其抛出屏幕。当我有一个精灵时,我没有这个问题;当我有多个精灵,我有问题。我将这些项添加到图层中,如下所示:

for(int i=0; i<maxCount; i++){
    CCSprite *x = [listOfItems objectAtIndex:i];

    //NSLog(@"(%f, %f)", x.position.x, x.position.y);

    [self addChild:x];
}

它们是在上面的步骤中创建的:

for (int i=0; i<maxCount; i++) {
    CCSprite *o = [CCSprite spriteWithFile:@"image.png"];
    o.position = ccp(windowSize.width/2,windowSize.width/2);

    [listOfItems addObject:o];

    [o release];
}

我猜真正的问题是我不知道如何处理 “当前”顶部。所以,如果我将数组索引0作为顶部,我可以继续使用触摸手势并在屏幕上“轻弹”它。第一个可以正常工作,但是当我触摸第二个时,它会与EXC_BAD_ACCESS崩溃。这是TouchesBegan方法:

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];
    startingPoint = location;

    //Trying something here....
    //if(current)
    //    [current release];

    current = [listOfItems objectAtIndex:currentPosition];
    [self reorderChild:current z:2];

    actionStartTime = [NSDate timeIntervalSinceReferenceDate];
}

当“在这里尝试某些东西......”行被取消注释时,这就是崩溃发生的地方,当它们被注释掉时,它会在分配current时发生。我知道我在这里遗漏了一些东西,但我无法弄明白。

3 个答案:

答案 0 :(得分:1)

有一点是删除[o release]; CCSprites被创建为自动释放的对象。

另外,要查找崩溃的原因,请尝试打开“运行”菜单下的“调试控制台”。控制台中的最后一件事通常会显示错误发生的原因。

答案 1 :(得分:1)

看看你如何设置current - 它被设置为[listOfItems objectAtIndex:currentPosition],这是你不拥有的对象。因此,在下一个轮次中,该对象可能已被解除分配,并且在取消分配(包括release)之后向其发送任何消息是未定义的行为,这将导致EXC_BAD_ACCESS 如果您'很幸运。 (如果你运气不好,它会导致更微妙,更难捕捉到错误。)

答案 2 :(得分:1)

如果您的对象全部添加到数组中,我发现最简单的方法是为每个对象设置不同的标记。

for(int i = 0; i < NUMOFOBJECTS; i++)
{
    CCSprite *sprite = blah blah whatever;

    // I do something like 100+i so that each time I want to
    // create different types of objects I can subtract the "100"
    // or whatever it is to get a base index value for arrays.
    sprite.tag = 100+i;
}

在您的CCTouches内部开始检查触摸以确保它在项目上然后您在那里迭代您的项目并仅移动具有正确标记的项目。

for(CCSprite *sprite in objects)
{
     if(sprite.tag - 100 == [objectOrderList objectAtIndex:0].tag)
     {
          // Do whatever
     }
}

将其视为伪代码,因为我只是写下了我的头脑。在这种情况下,您将跟踪NSMutableArray中的对象顺序,在更改订单时删除/替换/添加对象。