[SKAction removeFromParent]期间的EXC_BAD_ACCESS

时间:2014-07-24 08:09:24

标签: ios objective-c sprite-kit

好的,所以标题让这看起来很简单,但问题就在这里。这些对象仅通过下面的循环进行操作,并删除

[SKAction removeFromParent];

然后解决问题,只有对象仍然存在,因为我可以看到内存消耗随着时间的推移而增长,然后降低帧速率并且增加CPU。

我不知道为什么会导致内存访问异常。提前谢谢。

for (int i=0;i<30; i++) {
    SKSpriteNode *particle = [SKSpriteNode spriteNodeWithColor:[SKColor purpleColor] size:CGSizeMake(3, 3)];
    particle.zPosition = 0;
    particle.position = position; // passed in through method call
    [self addChild:particle];

    SKAction *move = [SKAction moveByX:ScalarRandomRange(-25, 25) y:ScalarRandomRange(-25, 25) duration:0.1];
    SKAction *fadeOut = [SKAction fadeOutWithDuration:0.5];

    [particle runAction:[SKAction sequence:@[move,fadeOut]] withKey:@"explosion"];
}

以下是电话会议地点的截图 - 发生问题的堆栈。

Call Stack problem area

我在更新方法中添加了以下代码

-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
NSMutableArray *killList = [[NSMutableArray alloc]init];

for (SKNode *node in [self children]) {
    if ([node.name isEqualToString:@"particle"]) {
        if (!([node actionForKey:@"explosion"])) {
            [killList addObject:node];
        }
    }
}

for (SKNode *node in killList) {
    [node removeFromParent];
}

}

它似乎修复了异常问题,但我仍然注意到内存略有上升,我需要在仪器中进行调查。

这似乎是解决问题的一种黑客方式,因为我应该能够使用

[SKAction removeFromParent];

在我的序列中。

1 个答案:

答案 0 :(得分:0)

我知道你想在调用removeFromAction方法之前检查你的节点是否仍然存在,这可以是一个解决方案:

particle.name = @"particle";

[particle runAction:[SKAction sequence:@[move, fadeOut, ([self childNodeWithName:@"particle"]?[SKAction removeFromParent]:nil)]]];

(我同意LearnCocos2D,除了removeFromAction之外,问题可能有不同的原因)