myArray는 NSDictionary 개체의 NSArray입니다. [myArray mutableCopy]에는 원본 NSDictionary 객체 또는 NSMutableDictionary 사본이 포함됩니까? 불변 객체 그래프를 완전히 변경 가능하게하는 간단한 방법이 있습니까?mutableCopy는 포함 된 객체를 변경할 수있게합니까?
답변
큰 개체 그래프에 필요한 시간이 걸릴 염려가없고 실제로 개체의 전체 복사본을 개로 만들려면 개체 그래프를 serialize 한 다음이를 deserialize 할 수 있습니다. 이 작업을 수행하는 가장 쉬운 방법은 모든 개체가 Foundation Collection 개체라는 가정하에 NSPropertyListSerialization 클래스를 사용하는 것입니다. 루트 개체를 데이터에 직렬화 한 다음 NSPropertyListMutableContainersAndLeaves
옵션을 사용하여 변경 가능한 루트 수준 배열에 deserialize하십시오. 생성 된 루트 레벨 변경 가능 배열은 전체 복사본이 될 것이고 모든 컨테이너는 변경 가능할 것입니다. 이 기능은 실제 사본이 될 것임을 기억하는 것이 중요합니다. 따라서 다른 컨테이너에서 무언가를 변경하면 해당 변경 사항이 원본 개체에 반영되지 않습니다. 난 당신이 블록 반복자를 사용하는 경우는 인덱스를 전달 될 것 때문에 더 효율적이 될 것입니다 모든 개체에 대해 그것을 볼 필요가 없습니다 것이라고 생각
// Assumes the root-level object is an array, adjust as necessary
- (NSMutableArray*)deepMutableCopyOfArray:(NSArray*)array error:(NSError**)outError
{
NSError* error = nil;
NSData* serializedData = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error];
if(!serializedData) {
if(outError) *outError = error;
return nil;
}
NSMutableArray* mutableCopy = [[NSPropertyListSerialization propertyListWithData:serializedData options:NSPropertyListMutableContainersAndLeaves format:NULL error:&error] retain];
if(!mutableCopy) {
if(outError) *outError = error;
return nil;
}
return mutableCopy;
}
코코아의 복사본은 일반적으로 얕습니다. 이것은 최상위 오브젝트 (이 경우에는 배열)에만 영향을 미친다는 것을 의미합니다. 불변의 사전을 변경할 수있는 배열로 끝날 것입니다. 당신이 묻는 것처럼 전체를 변경할 수있는 라이너가 없습니다.
이 작업을 수행하는 유일한 방법은 원본 배열을 반복하고 각 개체의 변경 가능한 복사본을 만들고 변경 가능한 배열의 변경 불가능한 개체를 해당 변경 가능한 형제로 바꾸는 것입니다. 휴, 변하기 쉬운 단어는 모든 의미를 잃어 버렸습니다.
NSArray *mutableArray = [originalArray mutableCopy];
for (NSDictionary *dictionary in originalArray)
{
NSInteger index = [originalArray indexOfObject:dictionary];
NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];
[mutableArray replaceObjectAtIndex:index withObject:mutableDictionary];
}
중첩 된 for 루프가있는 그래프를 자세히 살펴볼 수 있어야합니다. 배열의 크기에 따라 메모리를 확인하기 위해 자동 복구 풀이 필요할 수 있습니다.
: 여기
빠른 코드 예제입니다 . –아! 블록 기반 열거 형입니다. 지금 iOS 4 이상의 기기에서 사용 가능합니다. –
- 1. NSData가 포함 된 객체를 직렬화하는 방법은 무엇입니까?
- 2. ArrayList.clear()는 포함 된 모든 객체를 삭제합니까?
- 3. 포함 된 객체를 포함한 웹 페이지 검색
- 4. httpservletrequest 객체를 변경할 수 있습니까
- 5. jsp는 포함 객체에 객체를 전달합니다.
- 6. 레이크 작업이 포함 된 보석
- 7. 사용자가 텍스트와 숫자를 모두 EditText에 넣을 수있게합니까?
- 8. 파이썬에서 변경할 수있는 객체를 잠글 수 없다.
- 9. ReflectionProperty :: setAccessible는 속성을 영원히 액세스 할 수있게합니까?
- 10. Mongomapper 포함 된 문서 "객체를 직렬화 할 수 없습니다"오류
- 11. java 클래스가 매개 변수로 포함 된 객체를 전달하십시오.
- 12. node.js 함수 안에 완전히 포함 된 C++ 객체를 래핑해야합니까?
- 13. 포함 된 ASPX 코드에서 동적 객체를 참조 할 수 없습니다.
- 14. json에 포함 된 배열을 사용하여 Javascript 객체를 직렬화 하시겠습니까?
- 15. 포함 된 문서/MongoDB를
- 16. 포함 된 OR이 포함 된 스마트 컬렉션?
- 17. 포함 된 이미지를 Toolboxbitmap으로 포함
- 18. 코코아에 포함 된 리소스를 잠급니다.
- 19. 변경할 시뮬레이션 된 메트릭을 설정할 수 없습니다.
- 20. SASS가 포함 된 JqueryUI 테마
- 21. 성능 저하 셀 배열에 핸들 객체를 포함
- 22. Asp.Net의 포함 된 글꼴 사용
- 23. EF 4.1 DbContextGenerator 객체 이름 -이 객체를 변경할 수 있습니까?
- 24. 하나의 ArrayList에서 다른 객체의 참조를 사용하여 객체를 변경할 수 있습니까?
- 25. Class에있는 객체의 주소를 인수로 복사하여 나중에 객체를 변경할 수 있습니다.
- 26. Null 객체를 변경할 수있는 표준 패턴 또는 전략
- 27. 다형성 C++, 한 객체를 변경할 때 모든 객체가 변경됨
- 28. C#에서 변경할 수없는 객체에서 파생 된 변경 가능한 객체를 만드는 방법은 무엇입니까?
- 29. XText 객체를 문자 참조 및 엔터티가 해석 된 문자열로 변경할 수 있습니까?
- 30. 다른 jquery가 포함 된 Facebox
아쉽게도 입력 배열에 NSNull이 포함되어 있으면이 작업이 수행되지 않습니다. – Vytis