Sprite Kit泄漏没有意义

时间:2014-11-19 01:24:33

标签: memory-leaks sprite-kit

我一直在运行仪器,看看为什么我的SKScene不会解除分配并且没有任何意义的“泄漏”。其中一个“泄漏”是在一个正确解除分配的场景上并指向这个:

border.path = path;

由于导致泄漏的线路,但下一行是:

CGPathRelease(path);
border.lineWidth = 1.0f;
border.strokeColor = [SKColor yellowColor];
[border setAlpha:0.0f];
[border runAction:[SKAction fadeAlphaTo:1.0f duration:0.2f]];
[self addChild:border];

所以你可以清楚地看到它被释放了。我也正在为以下方法“泄漏”:

-(void)explosionShake{
//[self testTargets];
NSArray *objectArray = [self children];
for (SKNode *node in objectArray) {
    [node runAction:[SKAction moveBy:CGVectorMake(0.0f, 10.0f) duration:.05] completion:^{
        [node runAction:[SKAction moveBy:CGVectorMake(0.0f, -15.0f) duration:.05] completion:^{
            [node runAction:[SKAction moveBy:CGVectorMake(0.0f, 5.0f) duration:.05]];
        }];
         }];
    }

}

场景结束后,以及我从其中移除的另一个对象。

尝试在已从其父级删除的节点上运行操作会导致这些“泄漏”吗?因为当“爆炸摇摆”正在运行时,其中一个节点可能会在另一个方法中从其父节点中删除。这个方法怎么样:

SKEmitterNode *testForExplosion = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"explosionTest" ofType:@"sks"]];
//testForExplosion.position = location;
//[testForExplosion setParticleSpeed:self.frame.size.width/self.gameSpeed];
SKNode *node = [SKNode node];
[self addChild:node];
[node setPosition:location];
[node runAction:[SKAction moveBy:CGVectorMake(-self.frame.size.width, 0) duration:self.gameSpeed]];
[node addChild:testForExplosion];
SKAction *wait = [SKAction waitForDuration:4.0f];
SKAction *remove = [SKAction removeFromParent];
NSArray *array = [NSArray arrayWithObjects:wait,remove, nil];
SKAction *sequence = [SKAction sequence:array];

方法中的第一行以红色突出显示,最后一行以绿色突出显示(这只是方法的一部分)。我很困惑为什么这些是“泄漏”,但它可能有助于我的场景没有被解除分配。

如果有人能指出为什么这些方法可能导致内存泄漏,那将非常非常有用。当我的代码清楚地调用SKCSprite

时,我有更多的方法可能会泄漏removeFromParent s

1 个答案:

答案 0 :(得分:1)

1)
SKShapeNode不是游戏中最坚固的类。我的意思是,最好将SKSpriteNode与形状图像一起使用。如果仍然使用SKShapeNode,请尝试以下代码。可能不起作用,但试一试。

- (void)dealloc
{
    if(self.shapeNode){
        [self.shapeNode setPath:NULL];
        [self.shapeNode removeFromParent];
        self.shapeNode = nil;
    }
}

2)
很明显,该节点有很强的参考价值。可以重写如下:

-(void)explosionShake
{
    NSArray *objectArray = [self children];
    for (SKNode *node in objectArray) {

        // create a weak reference of the node
        __weak typeof(node) weaknode = node;

        // run action
        [node runAction:[SKAction moveBy:CGVectorMake(0.0f, 10.0f) duration:.05] completion:^{
            [weaknode runAction:[SKAction moveBy:CGVectorMake(0.0f, -15.0f) duration:.05] completion:^{
                [weaknode runAction:[SKAction moveBy:CGVectorMake(0.0f, 5.0f) duration:.05]];
            }];
        }];
    }
}

3)
第三部分似乎有一些缺失的代码,因为我没有看到泄漏。

检查此其他线程以获取如何使用完成块运行操作的示例。 SKAction Perform Selector syntax error
希望这会有所帮助。