【问题标题】:EXC_BAD_ACCESS KERN_INVALID_ADDRESS when accessing an NSManagedObject's Property访问 NSManagedObject 的属性时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS
【发布时间】:2017-05-26 22:17:59
【问题描述】:

在我的 NSManagedObjects 中,我有一些属性 A) 我不希望或不需要存储和 B) 只计算一次,并且只在需要它们时才计算,这样计算就不会重复(因为它们有点贵)。

这是我正在谈论的代码:

public class Sample: NSManagedObject {

    @NSManaged public var id: NSNumber
    @NSManaged public var anotherProperty: String?
    var orderedCustomObjects : Array<CustomObject>?

    func getOrderedCustomObjects() -> [CustomObject] {
        // application crashes on this line.
        if (orderedCustomObjects == nil) {
            // compute the custom object array here.
        }
        return orderedCustomObjects!
    }
}

public class CustomObject {
    var price : String?
    var quantity : String?
}

我在看似无害的线路上遇到以下崩溃,该线路在计算之前检查属性是否为 nil:

崩溃:com.apple.main-thread EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000048

对于我为什么会因此而崩溃的任何帮助,我们将不胜感激。

【问题讨论】:

  • EXC_BAD_ACCESSS 表示您正在访问的对象的内存已被释放。所以问题不在于 nil 检查,问题在于您正在访问其内存已被释放的对象。
  • 你是在哪里删除这个对象吗?请记住 Sample 是一个 NSManagedObject 子类。在 1 个 NSManagedObjectContext 中,只能有 1 个对象代表您的实体中的记录。如果您有 2 个,它们将是同一个实例,因此如果您删除 1 个并通过另一个访问,您可能会遇到麻烦。

标签: ios swift core-data nsmanagedobject


【解决方案1】:

正如 cmets 中提到的,答案是对象在另一个线程上被删除,导致它在主线程上被释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2020-04-13
    • 1970-01-01
    相关资源
    最近更新 更多