2010-12-27 3 views
2

읽을 때 I 상이한 document 물체 위에 루프 반복하는 다음 코드 가지고CoreData 누설 특성

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
NSData* data = [document primitiveValueForKey:@"data"]; 
[document.managedObjectContext refreshObject:document mergeChanges:NO]; 
[pool release]; 

"데이터"속성이 큰 덩어리 (1MB의 화상)이다. 그리고 할당 계기로 메모리를 모니터하면서 메모리 사용량이 증가하고 있습니다. 누수가 어디에서 왔는지와 어떻게 제거하는지 찾을 수 없습니다.

감사합니다.

+0

을 내가하지 * 데이터 *가 어디서든지 할당 된 것을 보아라. – Eiko

+0

좋은 점 @Kamchatka, 당신은 키'data'에 대한 값을 얻지 만 아무것도 설정하지 않는다. –

+0

CoreData에서 데이터의 값을 읽고 그것을 파일에 덤프하고 싶다. 그래서 내가 값을 할당하지 않아. – Kamchatka

답변

0

나는 풀을 배수하기 직전에 [document.managedObjectContext processPendingChanges]을 수행하여 문제를 해결할 수있었습니다. 그러나 어떤 변화가 있을지 이해하지 못합니다. 누군가가 저를 계몽 할 수 있습니까?

+0

mergeChanges 플래그를 설정 중이므로 NO로 설정하면 액세스 할 때 새 오브젝트를 작성하는 새 결함이 작성됩니다. – LaN

0

뭔가 뜻 않았다, 샘플 코드에 문제가 있습니다 : 데이터가 현재 autoreleasepool의 범위 내에서 할당되지 않은 것처럼

NSData *data = [document primitiveValueForKey:@"data"]; 

그것은 또한 당신의 autoreleasepool와 함께 출시되지

은 왜 동적 접근자가 아닌 primitiveValueForKey을 사용하고 있습니까?

동적 접근이 훨씬 더 효율적이며, 컴파일 시간 검사에 있습니다.

+0

코드가 바뀌 었습니다. 실제 코드에서 "data "나는 너 아니야. 내가 이동을하고 있기 때문에 동적 접근자를 불러라. 동적 접근자는 마이 그 레이션하는 동안 내가 쓰고있는 파일에서 "데이터"를 읽습니다. 그러나 이전 중에 "데이터"의 소스는 이전 CoreData Sqlite 데이터베이스의 데이터 필드입니다. – Kamchatka

0

[pool release] 대신 [pool drain]을 부르는 것은 어떻습니까?

+0

어떻게 도움이 될까요? iOS에서도 비슷한 동작을하지 않습니까? – Kamchatka

+0

죄송합니다. non-gc 환경에 관한 부분을 놓치 셨습니다. 내 대답을 무시 (또는 그것을 downvote). – Eimantas

0

processPendingChanges이 문제를 해결 한 것으로 보이는 것은 수입 할 때 NSManagedObjectContext의 UndoManager가 대량 가져 오기를 수행 할 때 변경 한 사항을 추적한다는 것입니다.

무엇을 processPendingChanges이 (내가 이해 한대로) managedObjectContext에 저장된 변경 사항을 영구 저장소로 푸시하고 있습니다.

[[document managedObjectContext] setUndoManager:nil] 시도 (또는 가져 오기위한 새로운 managedObjectContext를 작성하고 document.managedObjectContext가 '주'managedObjectContext 경우, 전무로의 UndoManager를 설정하면 실행 취소 등록을 해제 할 수 없습니다.

+0

이미 undoManager를 nil로 설정했습니다. 또한 이것은 iPhone에 있으며 기본적으로 undoManager는 nil이라고 생각합니다. – Kamchatka