重新定义SKNode意味着我必须重新添加节点作为孩子?

时间:2014-04-05 09:36:07

标签: ios iphone objective-c sprite-kit sknode

我的代码中有一个案例,如果我重新定义了它所指向的内容,我似乎必须重新添加一个子节点,但我不太明白为什么。

例如:

_worldNode = [SKNode node];
_childNode = [SKNode node]; //set childNode to point to a node here. 
_childChildNode = [SKSpriteNode spriteNodeWithImageNamed:@"test"];

[self addChild:_worldNode]; 
[_worldNode addChild:_childNode]; //add childNode to the worldNode
[_childNode addChild:_childChildNode];

//Later on...

[_childNode removeAllChildren]; //1. do I need to do this to clean up _childChildNode first?
_childNode = [SKNode node]; //set childNode to another node.
_anotherChildChildNode = [SKSpriteNode spriteNodeWithImageNamed:@"test"];
[_childNode addChild:_anotherChildChildNode];

//2. do I need to re-add _childNode to _worldNode now?

做1似乎在我的游戏中释放了很多节点,但我并不认为这是必要的,因为我将_childNode指向下面的另一个节点,所以我认为我最初的节点指向(和_childChildNode)的引用计数为0并将被取消分配?

我也不认为我需要做2,因为我之前已经将_childNode添加到_worldNode但是如果我不添加此行,我的游戏似乎空白了(可能来自removeAllChildren调用)。

你知道我在这里遗失了什么吗?

1 个答案:

答案 0 :(得分:1)

  

做1似乎在我的游戏中释放了很多节点,但我认为这不是必要的,因为我将_childNode指向下面的另一个节点,所以我认为我最初指向的节点(和_childChildNode)的引用计数为0并将被解除分配?

您需要从其父级中删除_childNode

[_childNode removeFromParent];

在您执行此操作之前,_childNode会保留在内存中,因为父节点拥有对_childNode的引用。此外,如果您致电removeFromParent,则拨打removeAllChildren是多余的。

将新节点分配给_childNode后,您必须再次将其添加到_worldNode,因为它是一个全新的节点:

_childNode = [SKNode node];
_anotherChildChildNode = [SKSpriteNode spriteNodeWithImageNamed:@"test"];
[_childNode addChild:_anotherChildChildNode];
[_worldNode addChild:_childNode];