2010-12-06 2 views
0

클래스 개체 선언이 여러 개 있고이를 NSMutableArray에 추가 한 다음 클래스 개체와 NSMutableArray 개체를 모두 수정한다고 가정합니다. 무슨 일이야?클래스를 NSMutableArray에 추가하고 해당 객체와 배열을 모두 변경하면 어떻게됩니까?

코드 예 :

MyClass *item1; 
MyClass *item2; 
NSMutableArray *itemHolder; 

item1 = [[MyClass alloc] init]; 
item2 = [[MyClass alloc] init]; 
itemHolder = [[NSMutableArray alloc] initWithObjects:item1,item2,nil]; 

-(void)someFunction{ 
    [item1 setVarName:@"item1"]; 
    [item2 setVarName:@"item2"]; 
    for(MyClass *items in itemHolder) [items setVarName:@"item"]; 
} 

나는 나는 보통 항목 1 해제 생각하고 항목 2 만 itemHolder로 추가 후 바로 메모리 관리 규칙을 위반하지 않는 이유는 무엇입니까? 당신이 (항목 1과 항목 2) 객체 배열로, 배열은 단지 포인터를 저장한다를 추가 할 때 때문에 할당 해제의 끝에서, 당신은 여전히 ​​모든

-(void)dealloc{ 
    [item1 release]; 
    [item2 release]; 
    [itemHolder release]; 
} 

답변

1

해제 할 수 있습니다. 개체 자체는 복사되지 않습니다.

그래서 당신은 당신이있는 NSArray에 항목을 추가 할 때 모두 행동 (동일한 인스턴스) 메모리 MGMT에 관해서는

, 동일 객체에 영향을 미치는는있는 NSArray의 첫 번째 항목에서 항목 1 또는 setVarName에 setVarName 때 , NSArray (변경 가능 여부)는 각각을 유지합니다. 배열의 할당이 해제되면 각 배열이 해제됩니다.

각 항목을 개별적으로 보관해야 할 필요가있는 경우 귀하의 예처럼 그렇게해야합니다. 그러나 일반적인 프로그램에서는 배열에 새로운 객체를 추가하고 배열이 유지 한 이후에 즉시 해제 할 것입니다.

그러나 다시 한 번 구체적인 예를 보지 않고 일반화하기는 어렵습니다.

+0

응답 해 주셔서 감사합니다. – okysabeni

0

이미 출시 된 항목을 출시하려고하면 EXC_BAD_ACCESS 또는 세그먼트 오류가 발생합니다. 같은 개체를 두 번 놓지 않도록하십시오.

당신이 클래스 객체를 변경하면 나중에 배열에 포함하고 개체가 항목 1 해제 또는 항목 2, 두 개의 다른 참조

에서 두 번 같은 개체를 해제됩니다 놓으면 다음 배열의 버전이 될 것입니다 영향을받으며, 반대의 경우도 마찬가지입니다.

관련 문제