Memory leaks 雪碧套件泄漏不';没有道理

Memory leaks 雪碧套件泄漏不';没有道理,memory-leaks,sprite-kit,Memory Leaks,Sprite Kit,我一直在运行仪器,以了解为什么我的SKScene不会解除分配,并得到毫无意义的“泄漏”。其中一个“泄密”发生在正确解除分配的场景中,并指向以下内容: border.path = path; 与导致泄漏的管线相同,但下一条管线为: CGPathRelease(path); border.lineWidth = 1.0f; border.strokeColor = [SKColor yellowColor]; [border setAlpha:0.0f]; [border runAction:[S

我一直在运行仪器,以了解为什么我的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]];
        }];
         }];
    }
}

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

这些“泄漏”可能是由于试图在已从其父节点删除的节点上运行操作造成的吗?因为“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];
方法中的第一行以红色突出显示,最后一行以绿色突出显示(这只是方法的一部分)。我很困惑为什么这些都是“泄密”,但这可能是为什么我的场景没有被释放的原因

如果有人能告诉我为什么这些方法可能导致内存泄漏,那将非常非常有帮助。当我的代码清楚地调用
removeFromParent
1)时,我还有很多方法可能会泄漏
SKCSprite
s
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)
第三部分似乎缺少一些代码,因为我没有看到漏洞

检查另一个线程,了解如何使用完成块运行操作的示例。

希望这有帮助。

如果您还没有在xcode中分析构建。仪器和分析中都可能存在误报。explosionShake可能会泄漏节点,因为每个完成块都强烈引用节点,但不能保证每个完成块都会运行(操作可以随时停止)。如果确实存在问题,为节点创建一个弱临时变量可以解决这个问题。路径很可能是误报,如前所述。@learncoso2d我已经完成了分析构建,只发现了一个“可能的泄漏”,我已经修复了它。我会发现,所有其他泄漏都是误报,这太好了,因为“泄漏”工具页面显示了总共33个泄漏(尽管在对我的代码进行了一些修改后,似乎没有一个泄漏与我的任何代码相关联,这很奇怪),我的游戏场景不是交易,这让我觉得游戏场景中一定有什么问题。可能是我的iPhone运行的是iOS 7.1.2吗?@learncos2D另外,你能给我举个例子,说明我如何创建对
节点的“弱引用”
?在我观看的所有教程中,我从未看到过这方面的内容。感谢您的评论,我只想澄清两件事:1、
sequence
执行的操作不会导致泄漏,但是
completion
blocks会吗?另外,在您的回答中,您的意思是在
节点
上运行第一个操作,并在
weakonde
上运行所有后续操作,而不是在
weakonde
上运行所有3个操作吗?为什么?!)使用
SKAction
序列时,您不会创建对对象的单独引用。你让雪碧套件来管理。当使用完成块或SKAction
runBlock
并调用节点时,该块将创建对该节点的强引用。当节点从父节点中移除时,块会将节点保留在内存中。2) 不要紧,如果您愿意,可以使用
weakode
。如果在
self
上运行操作,例如[
self-runAction:action completion:^(void){block}]
,这会有关系吗?我需要使用“自我”的“弱”版本吗?不,重要的是在区块内。如果在块内使用
self
,则可能存在泄漏。因此,我在块内引用的任何对象都必须是弱的?例如,在我的代码中,我有
[weakSelf runAction:[SKAction waitForDuration:.5f]完成:^{[self showtargetpositionindex:2];}]并且我还必须将块内部的
self
变成
weakSelf