我想将一个SKSpriteNode从一个SKNode移到另一个。 removeFromParent方法实际上会取消分配精灵。

例如,在这段代码中,MySprite是SKSpriteNode的子类,带有一个dealloc定制方法,该方法输出一个字符串,只是让我知道该对象已被释放:

SKNode *node1 = [SKNode node];
SKNode *node2 = [SKNode node];
//[self addChild:node1];
//[self addChild:node2];

MySprite *sprite = [MySprite spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(30, 30)];

[node1 addChild:sprite];
[sprite removeFromParent];
[node2 addChild:sprite];


在这种情况下,将子画面释放。我认为即使在调用removeFromParent之后,对sprite的强烈引用也应使其保持活动状态,但事实并非如此。

但是如果我不加评论[self addChild:node2];精灵没有被释放。

我在这里很困惑。如果removeFromParent释放了对象,则sprite应该为nil,并且将nil节点添加到父级时会出现错误。是不是该文档只是说removeFromParent:“从其父节点中删除接收节点。”但是它并没有说明如何在这里管理内存。

最佳答案

removeFromParent:除非他的父母是唯一持有对它的引用的人(通过parent-> child关系),否则不会取消分配该节点。

在您的情况下,如果将sprite释放在removeFromParent上,则会按照您的建议看到添加nil child的异常。得出的结论不是。

这让我知道发生了什么事:


但是如果我不加评论[self addChild:node2];精灵没有被释放。


您可能正在检查本地范围之外的sprite。

{
    //Local scope starting
    SKNode *node = [SKNode node];
    //Node created and exists here

    //[self addChild:node];
    //Node is not added to scene or parent node(self)

    SKSPriteNode* sprite = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(30, 30)];
    [node addChild:sprite];
}
/*
Local scope ended if node isn't added to parent(self) it get deallocated,
along with the content.
In case //[self addChild:node] was uncommented, node would not be deallocated
and sprite would still be "alive"
*/


只要有人持有对对象的引用,它就不会被释放。

10-05 20:12