Ios7 如何在SKSpriteNode节点之间移动SKSpriteNode

Ios7 如何在SKSpriteNode节点之间移动SKSpriteNode,ios7,automatic-ref-counting,sprite-kit,skspritenode,sknode,Ios7,Automatic Ref Counting,Sprite Kit,Skspritenode,Sknode,我想将一个SKSpriteNode从一个SKNode移动到另一个SKNode。removeFromParent方法实际上取消分配精灵 例如,在这段代码中,MySprite是SKSpriteNode的一个子类,带有一个dealloc自定义方法,该方法输出一个字符串,只是为了让我知道对象已被解除分配: SKNode *node1 = [SKNode node]; SKNode *node2 = [SKNode node]; //[self addChild:node1]; //[self addCh

我想将一个SKSpriteNode从一个SKNode移动到另一个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:不会解除分配节点,除非其父节点是唯一持有该节点引用的人(通过父节点->子节点关系)

在您的情况下,若sprite在removeFromParent上解除分配,您将看到添加nil子项的异常,正如您所建议的。这就得出结论,事实并非如此

这让我知道发生了什么:

但如果我取消注释[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"
*/

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

有一种方法可用于此目的:

 SKNode.moveToParent(parent: SKNode)
将节点移动到场景中的新父节点。节点在场景坐标中保持其当前位置

资料来源:

谢谢。对,应该是范围。我为精灵创建了一个实例变量,但它没有被释放。