雪碧套件泄漏没有意义(Sprite Kit leaks don't make sense)

2019-10-21 07:37发布

我已经运行仪器,看看为什么我的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];

所以,你可以清楚地看到它的released.I我也越来越“泄漏”的类似的方法:

-(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]];
        }];
         }];
    }

}

之后现场结束,也是另一个对象,我要从它的父。

难道这些“泄密”,试图运行已被删除,从它的父节点上的动作引起的? 因为作为“explosionshake”正在运行时,从它的父在另一种方法中的一个节点可以被去除。 这个怎么样的方法:

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

Answer 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进行选择语法错误
希望这可以帮助。



文章来源: Sprite Kit leaks don't make sense