【问题标题】:Re-defining SKNode means I have to re-add the node as a child?重新定义 SKNode 意味着我必须将节点重新添加为子节点?
【发布时间】:2014-04-05 09:36:06
【问题描述】:

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

例如:

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

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

【问题讨论】:

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


    【解决方案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];
    

    【讨论】:

    • 嗯是有道理的——没有意识到父节点持有对子节点的引用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多