1

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

例如:

_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 调用),我的游戏似乎只是空白。

你知道我是否在这里遗漏了什么吗?

4

1 回答 1

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];
于 2014-04-05T09:44:21.747 回答