CoreDataのinsert時のオブジェクトの解放方法を教えてください
CoreDataのinsert時のオブジェクトの解放方法を教えてください。
例えば、エンティティーpin, ponとの関係を1対多として、ArrangementをOrderedにします。
サンプルコードではpinに対してponを100件づつ生成しsava()しています。
save()後にcontextをreset()し、このタイミングでオブジェクトは解放されることを期待していますが、解放できていないようです。
オブジェクトが解放されないとinsert可能なデータ量はストレージサイズより極小のメモリサイズの制限を受けてしまいます。
コードの不備などありましたら教えてください。
(CoreData model)
Entities:
Entity|Attribute|Type
======+=========+======
Pin |name |String
Pon |name |String
Relationships:
Entity|Relationship|Destination|inverse|type |Arrangement
======+============+===========+=======+=======+===========
Pin |Pons |Pon |pin |To Many|Ordered
Pon |pin |pin |pons |To One |-
(code)
[AppDelegate.swift]
func applicationDidFinishLaunching(_ aNotification: Notification) {
for i in 0..<10 {
let pin = NSEntityDescription.insertNewObject(forEntityName: "Pin", into: managedObjectContext) as! Pin
pin.name = "pin\(i)"
for j in 0..<100 {
let pon = NSEntityDescription.insertNewObject(forEntityName: "Pon", into: managedObjectContext) as! Pon
pon.name = "pon\(j)"
pon.pin = pin
}
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch {
let nserror = error as NSError
NSApplication.shared().presentError(nserror)
}
}
managedObjectContext.reset()
// ここでpin, ponが解放されていて欲しいのだけど...
}
NSLog("breakpoint") // ここにbreakpointを設定して Xcode8のMemory Graphを見るとオブジェクトPonが1,000件残ってる。
}