NSManagedObjectContext中的EXC_BAD_ACCESS

时间:2015-10-01 21:24:54

标签: ios swift core-data

我继承了一些快速代码,它们在从核心数据中获取后立即执行refreshObject。被提取的对象与另一个表有关系。 fetch和refreshObject位于performBlockAndWait中。代码如下。崩溃似乎是从iOS9开始的。

  • 知道为什么refreshObject会抛出EXC_BAD_ACCESS吗?有什么问题?
  • 获取后立即执行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
            }
        }
    }
    

提前感谢您提供的任何帮助!

value of context

what group is

1 个答案:

答案 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
    }
    ...
}