我继承了一些快速代码,它们在从核心数据中获取后立即执行refreshObject。被提取的对象与另一个表有关系。 fetch和refreshObject位于performBlockAndWait中。代码如下。崩溃似乎是从iOS9开始的。
获取后立即执行refreshObject的目的是什么?该表只包含几行。这有必要吗?将所有这些一起移除的任何不利之处?
context.performBlockAndWait {
let className = self.className()
let fetchRequest = NSFetchRequest(entityName: className)
groups = (try? context.executeFetchRequest(fetchRequest)) as? [FavoriteLocationGroup]
if groups != nil {
groups!.sortInPlace { $0.name < $1.name }
for group in groups! {
context.refreshObject(group, mergeChanges: false) <<< crashes here
}
}
}
提前感谢您提供的任何帮助!
答案 0 :(得分:6)
您可以尝试用
替换sortInPlace行吗?groups = groups!.sort { $0.name < $1.name }
我遇到了类似的问题。调用sortInPlace后,应用程序在发布模式下随机崩溃。它似乎导致某种内存损坏。 sort()效果很好。
Upd:我能够使用以下代码重现崩溃(在OS X Cocoa应用程序中也崩溃):
import Cocoa
class MyObject {
var x: Int?
}
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
var array = [MyObject]()
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Insert code here to initialize your application
for x in 0..<100000 {
let object = MyObject()
object.x = x
array.append(object)
}
array.sortInPlace { $0.x < $1.x } // CRASH
}
...
}