4

자식 노드가 여러 개인 사용자 정의 CCNode 클래스가 있으며 일부 사용자 정의 전환을 만들기 위해 자식에 대한 참조를 유지하려고합니다. 사용자 정의 클래스는 다음과 같이 보일 것이다 아이 배경 예를 들어Cocos2d에서 ARC를 사용하여 자식 노드에 대한 참조를 보유하는 방법 속성

:

@interface MyNode : CCNode 
@property (nonatomic, strong) CCNode *background; 
@end 

@implementation 
- (void)setBackground:(CCNode *)background { 
    if (_background) { 
     [self removeChild:_background]; 
    } 
    if (background) { 
     [self addChild:background]; 
    } 
    _background = background; 
} 
- (void)runTransition { 
    if (_background) 
     [_background runAction:[…]]; 
} 
@end 

문제는이이 메모리에서 해제되고 있지 않습니다 노드 배경으로 ARC에 사이클을 유지하는 원인이다.

답변

1

메모리 관리에 대한 엄격한 규칙은 없습니다. 코드를보고 사용할 최상의 방법을 결정해야합니다.

배경이 하나뿐이기 때문에 그 속성을 약하게 만들 수도 있습니다. Cocos2d는 씬 그래프에있는 모든 노드에 대한 강력한 참조를 보유하고 있으므로이를 유지할 것입니다.

이것은 모든 노드가 약하게 저장되어야한다는 것을 의미하지는 않으며, 씬 그래프에없는 경우 노드가 어슬 거리기를 원할 때가 있습니다.

1
가 제로 약한 참조 사용하도록 인터페이스를 변경

:

@interface MyNode : CCNode 
@property (nonatomic, weak) CCNode *background; 
@end 

배경 노드 할당 해제를의 _background의 바르가 자동으로 nil이 될 것입니다. 그렇게하면 더 이상주기를 유지할 수 없습니다. 노드의 자식 또는 손자 인 노드에 노드 참조를 저장하면 항상 유지주기가 발생하기 때문에 이는 일반적으로 좋은 습관입니다.

코드가 약한 참조로 정상적으로 작동해야합니다.

작성 및 약한 참조를 할당 할 때이이 전무 노드와 실패 예를 들어, 조심해야하지만

참고 자식으로 추가되는 :

_background = [CCNode node]; 
[self addChild:_background]; 

여기서 문제는 할당 후 , 배경 노드를 강력하게 유지할 것이 없으므로 addChild : 행 앞에 deallocates와 nil로 설정됩니다.

간단한 해결 방법은 다음과 같습니다

CCNode* bg = [CCNode node]; 
[self addChild:bg]; 
_background = bg; 

노드가 아이로서 추가 한 후, 아이들의 배열은 노드에 대한 강한 참조를 개최한다. 따라서 addChild : 행 다음에 임시 bg 노드를 _background ivar에 할당 할 수 있습니다.

+0

다음과 같은 질문을 던집니다. 처음부터 @property가 필요합니까? 일반 (void) setThisAndThadNode : (CCNode *) theNode; __weak CCNode * _thisAndThat; 인터페이스에서 선언. – YvesLeBorg

+0

컴파일러가 약한 속성이나 인스턴스 var가 예측할 수없는 nil로 설정 될 수 있다고 말하면서 불평합니다. 메소드가 실행되는 동안 자식 노드에 대한 참조를 보유 할 수있는 __strong 로컬 변수를 만들 수 있습니다. – rraallvv

+0

문제가되는 코드 (문맥에 대한 주변 정보)와 정확한 오류 메시지로 새로운 질문을 할 수 있습니까? 일반적으로 컴파일러는 제 대답의 첫 번째 코드 조각과 같은 것이 아니라면 불평해서는 안됩니다 – LearnCocos2D