2011-08-28 3 views
1

이 방법으로 객체 그래프를 통과하는 것이 객관적으로 타당한가?

다음과 같은 재귀 객체 구조가 있다고 가정 해보십시오.

MyComposite *c = [MyComposite compositeWithName:@"Jack"]; 

// add/append some children ...  

do 
{ 
    // do something with the current composite 
    ... 
    // continue traversal 
    c = [c child]; 
}while (c); 

이 통과는 메모리 관리 측면에서 유효합니까?

+1

은 자식 개체의 할당 유형에 따라 달라지며 부모가 적절하게 유지 및 해제되는 경우 (@dynamic 또는 @property ...) –

+0

부모가 약한 속성 (비 원자, 할당)이고 자식이 속성 (비 원자, 유지) –

+0

그래프에 c.child를 c에 할당하여 방해 받는지 궁금합니다 –

답변

2

네, 괜찮습니다. c는 MyComposite의 인스턴스를 가리키는 로컬 변수입니다. 다른 MyComposite 포인터 값을 C에 다시 할당해도 원래 MyComposite 인스턴스에는 영향을주지 않습니다.

Yuji의 대답과 관련하여 NSArray 또는 NSSet을 사용하여 재귀 적 데이터 구조를 저장하면 안됩니다. 데이터 구조는 문제가 없습니다. NSArray 및 NSSet은 평면 데이터 세트 용으로 설계되었으며 NSArray의 경우 선형 순서 지정을 적용하는 것 이외에는 멤버 간의 관계를 지정할 수 없습니다.

+0

해명 해 주셔서 감사합니다 –

3

이론적으로는 아무 문제가 없습니다. 그러나 :

  1. 일반적으로 목표 - C에서, 당신은 단지 NSArray 또는 NSSet을 사용하고, 당신은 당신의 자신의 연결된 목록 클래스를 작성하지 않습니다. NSArray은 실제 표준 배열에서는 배열이 아닙니다. 예를 들어, 중간에 오브젝트를 삽입하는 것은별로 속도가 느리지 않습니다.
  2. WTP에 따르면 getter의 이름을 get...으로 지정하지 않았습니다. 속성 이름이 foo 인 경우 가져 오기 도구의 이름은 foo이고 설정자는 setFoo:입니다. 대부분 컨벤션이지만, 코코아 시스템의 일부는이 협약에 달려 있습니다. 따라서이 문장을 읽었을 때 즉시 메서드의 이름을 변경하십시오.
관련 문제