我一直在运行仪器,看看为什么我的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
答案 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
希望这会有所帮助。