2011-08-09 4 views
1

다른 팀에서 작성한 핵심 데이터를 사용하는 iPhone 앱용 코드를 상속 받았습니다. 객체 간의 관계와 객체가 코드에서 생성/사용되는 방식을 살펴볼 때 영구 저장소에 메모리 누수가 있음을 깨닫게되었습니다. 개체가 남겨진 핵심 데이터에서 모든 최상위 개체를 삭제하면 충분합니다. 그밖에는 한 객체의 값/관계가 다른 객체에 복사되고이 객체가 핵심 데이터의 고아 객체로 남겨진 연산이있었습니다.영구 저장 장치에 메모리가 누출 됨

나는 그 이후로 문제를 고쳤으며 더 이상 새로운 고아 개체가 핵심 데이터에 저장되지 않습니다. 문제는 지금 얼마나 오래된 지 누가 알 수 있듯이 누출 된 응용 프로그램을 사용하고있는 기존 사용자의 영구 저장소에서 이러한 고아 개체를 제거하는 것입니다.

필자의 초기 생각은 최상위 수준의 개체를 다른 ManagedObjectContext로 복사하는 것이 었습니다. 그런 다음 원래 컨텍스트에서 모든 오브젝트를 삭제하십시오. 마지막으로 최상위 수준의 개체를 원래 컨텍스트로 다시 복사합니다. 누구든지이 문제를 보거나 더 좋은 아이디어가 있습니까?

답변

1

고아 개체는 비어있는 관계가 있어야 비어있는 관계를 가져 와서 반환 된 개체를 삭제할 수 있습니다.

고아 오브젝트를 방지하기 위해 데이터 모델을 업데이트하려고합니다. 고아는 대개 잘못 설계된 모델의 신호입니다. 모든 관계에 상호성이 있고 필요한 경우 관계를 형성해야합니다. 고아를 방지하기 위해 유효성 검사를 추가 할 수도 있습니다.

+0

데이터 모델이 문제의 일부분입니다. Cascade 대신 Nullify로 설정된 관계가 있습니다. 유효성 검사가 의미하는 바가 궁금합니다. 방법을 확인 하시겠습니까? – iHorse

+0

빈 관계를 가져 오는 것에 동의합니다. 유효성 검사를 위해서는 validateFor <...> 관리 대상 객체 클래스의 삽입, 업데이트, 삭제를 무시하고 일부 논리를 거기에 넣을 수 있음을 의미합니다. 실패하면 개체가 저장되지 않고 '고아로 인해 개체를 저장할 수 없습니다.'와 같은 오류 메시지를 작성하고 제기 할 수 있습니다. – Leonardo

관련 문제