2017-01-09 80 views
1

我在儀器中注意到,無論何時創建一個NSManagedObject,此對象中至少有一個永遠留在內存中。我創建了一個名爲「實體」的實體的空項目。即使在初始化之後,NSManagedObject在內存中仍然存在

這個實體類:

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幾個實例:

instances

當視圖控制器deinitializes,我清理上下文使用:

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

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

所以視圖控制器已經deinitialized後,儀器仍顯示出的Books 1個對象:

persistent

沒有什麼別的視圖控制器和日誌中顯示所有實例和控制器deinitialized。

問:
如果我創建各種實體的多個實例,那麼所有的人都會留在記憶永遠。有沒有辦法擺脫它,所以我可以保持記憶「乾淨」?

編輯:
視覺記憶調試器截圖添加

Visual Memory Debugger

回答

2

簡短的回答是,refresh呼叫無關與一個對象是否是在內存中。該代碼對於您正在查看的數據完全沒有任何影響。 refresh調用與mergeChanges:false表示核心數據可以將對象轉換回故障。它的屬性值和關係可能會從內存中刪除,但對象本身仍然存在。至於爲什麼在內存中仍然存在單個實例,這是因爲某個地方你有對該對象的引用。分配工具不會對此有所幫助。如果你擔心,你最好試試Xcode的memory graph debugger。不過,我建議,除非你的內存情況非常糟糕,否則追蹤一個64字節的分配可能不是一個高優先級。

+0

感謝您的信息,鏈接(和鏈接裏面)是非常有用的。我添加了Visual Memory Debugger的屏幕截圖。我還沒有真正理解(但)什麼意思,但是我感覺它是'NSManagedObjectContext'工作原理,它超出了我的控制範圍。你說得對,64字節是不值得的。我只是爲了好奇才發佈了這個截圖,或許它可以幫助我更好地理解Core Data。 –

相關問題