2

하나의 SKNode에서 다른 SKNode로 SKSpriteNode를 이동하려고합니다. removeFromParent 메서드는 실제로 스프라이트를 할당 해제합니다. 스프라이트가 할당이 해제 된이 경우에SKNode간에 SKSpriteNode를 이동하는 방법

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]; 

:이 코드 mySprite는 예를 들어

출력 문자열, 날 개체가 해제 된 것을 알 수 있도록하는 할당 해제의 사용자 정의 방법 SKSpriteNode의 서브 클래스입니다 . 나는 sprite에 대한 강력한 참조가 removeFromParent를 호출 한 후에도 살아 있어야한다고 생각했지만 그렇지 않습니다.

하지만 [self addChild : node2]의 주석을 제거한 경우; 스프라이트의 할당이 해제되지 않았습니다.

저는 꽤 혼란 스럽습니다. removeFromParent가 객체를 할당 해제 한 경우 sprite는 nil이어야하며 상위 노드에 nil 노드를 추가 할 때 오류가 발생합니다. 그렇지 않니? 설명서에서는 removeFromParent : "수신 노드를 부모 노드에서 제거합니다."라고 말합니다. 하지만 여기서 메모리를 관리하는 방법에 대해서는 아무 것도 말하지 않습니다.

답변

2

removeFromParent : 부모가 부모 -> 자식 관계를 통해 참조 된 유일한 사람인 경우를 제외하고는 노드의 할당을 해제하지 않습니다.

sprite가 removeFromParent에 할당 해제 된 경우 귀하가 제안한대로 nil child를 추가하는 경우 예외가 표시됩니다. 그 결론은 그렇지 못했습니다.

나에게 무슨 일이 일어 났는지 생각했다 :

을하지만 주석 처리하면 [자체로 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" 
*/ 

누군가가 객체에 대한 참조를 보유하고 있으면 할당 해제되지 않습니다.

SKNode.moveToParent(parent: SKNode) 

장면에 새로운 부모 노드에 노드를 이동 :

+0

감사합니다. 그게 바로 범위였습니다. 스프라이트에 대한 인스턴스 변수를 만들었고 할당을 해제하지 않았습니다. – zago

관련 문제