2011-05-12 2 views
0

Objective-C에서 변경 가능한 컨테이너에 저장된 개체를 수정하는 것과 관련하여 약간의 설명이나 조언이 필요합니다. 이라고하는 NSMutableArray이 있고 그 중 에 대해 각각 country에 대한 세부 정보가 저장되어 있다고 가정 해 보겠습니다.Objective-C 수정 가능한 요소가있는 컨테이너

NSMutableArray *countries = [[NSMutableArray alloc] init]; 

NSMutabelDictionary *country = [[NSMutableDictionary alloc] init]; 
[country setObject: @"United States" forKey: @"Name"]; 

[countries addObject: country]; 

나중에 내가 countries에 저장된 country 수정할. 나는이 작업을 수행 할 수 있습니다으로 : 결과는 동일

:

[[countries objectAtIndex: 0] setObject: @"United States of America" forKey: @"Name"]; 

또는한다. 내 C++ 배경으로, 나는 처음에 cntcountries에 위치 0에있는 객체의 복사본이 될 것이라고 생각하고 수정 한 후에 수정 된 객체를 다시 countries에 넣어야했습니다. 그러나 배열 countriesreplaceObjectAtIndex 메시지를 보내지 않아도 업데이트 된 country 개체를 계속 보유합니다.

이러한 상황을 처리하는 방법에 대한 조언을 주시면 감사하겠습니다. 변경 가능한 컨테이너의 수정 된 객체를 새 컨테이너로 명시 적으로 대체하는 것이 더 낫지 않습니까? 아니면 완전히 필요하지 않습니까?

+2

실제로 완전히 불필요합니다. 참조 : http://stackoverflow.com/questions/5915711/can-we-use-nsmutable-objects-as-members-of-a-non-nsmutable-class/5915831#5915831 –

+1

Objective-C에는 기능이 없습니다. 값으로 전달하거나 C++ 에서처럼 시맨틱을 복사하십시오. –

+0

좋아요. 배열'countries'에서'country'를 제거하면 어떻게 될까요? 'country' 사전을 배열에서 제거한 후에도 여전히 그것을 풀어 줘야합니까? 의견을 바탕으로 나는 이것을 가정했을 것이다. 그러나 이것을 시도했을 때 프로그램이 추락했다. – kadam

답변

2

어느 경우에도 NSMutableDictionary 사본이 생성되지 않았습니다. [countries objectAtIndex: 0]에 전화하면 countries 배열에있는 동일한 NSMutableDictionary 개체에 대한 참조가 표시됩니다. 따라서이 개체에 대한 모든 수정 내용은 countries 배열에서 반환 된 인스턴스에 자동으로 반영됩니다.

즉, 단일 개체 인스턴스에 대해 두 개의 포인터가 있으며 변경 가능한 컬렉션 형식의 내용을 수정해도 컬렉션의 복사 된 인스턴스가 생성되지 않습니다.