2014-02-07 78 views
2

我想將SKSpriteNode從一個SKNode移動到另一個SKNode。 removeFromParent方法實際上釋放了精靈。如何在SKNode之間移動SKSpriteNode

例如,在這個代碼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釋放了該對象,那麼精靈應該是零,並且我應該向父節點添加一個無節點的錯誤。不是嗎?該文檔只是說,removeFromParent:「從其父母刪除接收節點。」但它並沒有說明如何在這裏管理內存。

回答

2

removeFromParent:除非他的父母是唯一持有引用的人(通過父 - 子關係),否則不會釋放該節點。

在你的情況下,如果精靈在removeFromParent上被釋放,你會看到添加零子的異常,正如你所建議的那樣。這導致了它不是的結論。

這給了我一個想法發生了什麼:

但是,如果我註釋掉[個體經營的addChild:節點2]。精靈未被釋放。

您可能正在檢查本地範圍之外的精靈。

{ 
    //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" 
*/ 

只要有人持有對象的引用,它就不會被釋放。

+0

感謝。正確的是由於範圍。我爲精靈創建了一個實例變量,並且未釋放它。 – zago