2009-12-15 3 views
2

아래 코드에서 볼 수 있듯이 Vertex를 만들고 초기화 한 다음 프레임 객체 내 NSMutableArray 인스턴스 변수에 추가합니다. 현재이 설정을 가지고 있기 때문에 myVert는 main이 소유하고 vertexList가 가리키고 있습니다. 개체를 데이터의 소유권으로 가져 가도록 addVertex 메서드 내에서 inVertex의 복사본을 만들도록 설정하는 것이 더 좋을까요? 내가보고해야한다, 그렇게 할 수있는 최선의 방법이 무엇인지 사본을해야하는 경우 마지막으로개체가 데이터를 소유하고 있습니까?

-(void)addVertex:(Vertex*) inVertex { 
    [vertexList addObject:inVertex]; 
} 

// ------------------- 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Frame *myFrame; 
    Vertex *myVert; 

    NSLog(@"MDD_ObjectTest ... "); 
    myFrame = [[Frame alloc] init]; 
    myVert = [[Vertex alloc] initWithxPos:111 yPos:222 zPos:333]; 

    [myFrame addVertex:myVert]; 
    [myVert release]; 

    // Clean up 
    [myFrame release]; 
    [pool drain]; 
    return 0; 
} 

...

-(void)addVertex:(Vertex*) inVertex { 
    [vertexList addObject:[inVertex copy]]; 
} 

나는 측면에서 할 무엇을 조금 확실하지 오전하지만 copyWith 존에 관한 Vertex 오브젝트

게리

답변

3

이것은 Vertex가 변경 가능한지 여부에 달려 있습니다.

정점이 불변 인 경우

는 다음 inVertex는 데이터의 변경이 없기 때문에

, 당신이 그것을 가지고 현재의 방법은 괜찮습니다. VertexList는 inVertex를 추가 할 때 inVertex를 유지하고 제거 할 때 해제합니다. inVertex의 속성을 변경할 수 없기 때문에 사본과 사본을 저장하는 데 차이가 없습니다.

정점 변경할 경우

: inVertex에 대한 변경 사항이 목록에 저장된 정점에 영향을주지 않도록 당신은 사본을 저장해야

. 그러나 현재 메모리 누수가 발생할 수 있음을 유의하십시오. 사본의 보유 수를 1로 설정 한 객체를 복사 할 때 vertexList에 저장하면 보유 수는 2가됩니다. 목록에서 제거하면 보유 수는 1이되어 메모리 누수의 원인이됩니다 그것을 공개하는 것을 잊지 마십시오. 그것을 놓을 수있는 가장 좋은 장소는 addVertex 메소드가 vertexList에 추가 된 후에 addVertex 메소드에있을 것이고, 그 중 하나만이 참조를 가지고 있기 때문에 보유 수를 1로 유지합니다.

- (void) addVertex:(Vertex *) inVertex { 
    Vertex * copy = [inVertex copy]; 
    [vertexList addObject:copy]; 
    [copy release]; 
} 

꼭지점이 작동하려면 NSCopying 프로토콜을 구현해야합니다.

편의성 이외의 다른 정점을 변경할 수있는 실제적인 이유가 없다면 변경 불가능한 접근 방식을 사용하는 것이 좋습니다.

편집 : 방법 : copyWithZone:

에 대해서 당신이 copyWithZone를 정의하는 NSCopying의 protcol을 구현해야 복사 객체를 구현합니다. 영역을 만들 때 고려해야 할 유일한 사항은 Vertex 클래스에서 alloc 메서드를 호출하는 대신 allocWithZone : 메서드를 호출하는 것입니다.

- (id) copyWithZone:(NSZone *) zone { 
    Vertex * copy = [[Vertex allocWithZone:zone] initWithxPos:x yPos:y zPos:z]; 
    // Any other copying that needs to be done 
    return copy; 
} 
+0

많은 감사의 말씀을드립니다 ... – fuzzygoat

관련 문제