【发布时间】:2014-11-19 01:24:33
【问题描述】:
我一直在运行 Instruments 以了解为什么我的 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
【问题讨论】:
-
如果您还没有在 xcode 中进行分析构建。 Instruments 和 Analyze 都可能出现误报。由于每个完成块都强烈引用节点,因此爆炸摇动可能会泄漏节点,但不能保证每个完成块都运行(可以随时停止操作)。为节点创建一个弱临时变量将解决这个问题,如果它确实是一个问题。这条路径很可能是误报,以前见过。
-
@LearnCocos2D 我已经进行了分析构建,只提出了一个“可能的泄漏”,我已修复。我觉得所有其他泄漏都是误报实在太好了,因为“泄漏”仪器页面总共显示了 33 个泄漏(尽管在对我的代码进行了一些修改之后,似乎没有一个泄漏链接到任何我的代码,这很奇怪),我的游戏场景没有解除分配,这让我觉得场景中一定存在某种问题。会不会是我的 iPhone 运行的是 iOS 7.1.2?
-
@LearnCocos2D 另外,您能否提供一个示例,说明如何创建对
node的“弱引用”?在我看过的所有教程中,我从来没有看到过关于这个的东西。