我的代码中有一个案例,如果我重新定义了它所指向的内容,我似乎必须重新添加一个子节点,但我不太明白为什么。
例如:
_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调用)。
你知道我在这里遗失了什么吗?
答案 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];