2017-01-09 4 views
1

악기에서 발견 된 것은 NSManagedObject을 생성 할 때마다 적어도 하나의이 객체가 메모리에 영구히 남아 있다는 것입니다. 저는 "Books"라는 이름의 엔티티가있는 빈 프로젝트를 만들었습니다.초기화되지 않은 상태에서도 메모리에있는 NSManagedObject

이 엔터티의 클래스 :

instances

뷰 컨트롤러 deinitializes, 나는 위로 청소 :

class Books: NSManagedObject { 

    @NSManaged var name: String 

    convenience init(context: NSManagedObjectContext, name: String) { 
     let description = NSEntityDescription.entity(forEntityName: "Books", in: context)! 
     self.init(entity: description, insertInto: context) 

     self.name = name 
    } 

    deinit { print("\(type(of: self)): deinitialized") } 
} 

는, 악기 Books의 여러 인스턴스를 Books 여러 나타나 내가 만들 때 문맥 :

deinit { 
    context.registeredObjects.forEach { context.refresh($0, mergeChanges: false) } 

    print("\(type(of: self)): deinitialized") 
} 
이 아무것도 뷰 컨트롤러에없고 로그가 모든 인스턴스를 표시하고

persistent

컨트롤러 deinitialized됩니다 뷰 컨트롤러가 deinitialized 한 후

그래서, 악기는 여전히 Books 1 개체를 보이고있다.

질문 :
나는 다양한 개체의 인스턴스를 만드는 경우
, 그때 그들 모두가 영원히 기억에 남아 있습니다. 메모리를 "깨끗하게"유지할 수있는 방법이 있습니까?

편집 : 비주얼 메모리 디버거의
스크린 샷은 짧은 대답은 refresh 호출이 객체가 메모리에 있는지 여부와는 상관이 없다는 것입니다

Visual Memory Debugger

답변

2

을 추가했다. 이 코드는 당신이보고있는 데이터에 전혀 영향을 미치지 않습니다. mergeChanges:false과 함께 refresh 콜은 Core Data가 오브젝트를 폴트로 다시 변환 할 수 있다고 말합니다. 속성 값과 관계가 메모리에서 삭제 될 수 있지만 개체 자체는 그대로 유지됩니다.

왜 메모리에 여전히 하나의 인스턴스가 있는지에 대한 이유는 그 객체에 대한 참조가 있기 때문입니다. 할당 도구는 도움이되지 않습니다. 걱정되는 경우 Xcode의 memory graph debugger을 시도하는 것이 좋습니다. 나는 비록 메모리 상황이 극히 나쁘지 않다면, 하나의 64 바이트 할당을 추적하는 것이 최우선 순위는 아니라고 생각한다.

+0

위대한 정보 주셔서 감사합니다, 링크 (및 내부 링크) 정말 유용합니다. Visual Memory Debugger의 스크린 샷을 추가했습니다. 모든 것을 의미하지만 실제로 NSManagedObjectContext가 어떻게 동작하는지 알지 못한다. 그리고 당신 말이 맞습니다. 64 바이트는 가치가 없습니다. 호기심을 위해 스크린 샷을 게시했습니다. 코어 데이터를 더 잘 이해할 수 있습니다. –