访问 NSManagedObject 的属性时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS

Posted

技术标签:

【中文标题】访问 NSManagedObject 的属性时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS【英文标题】:EXC_BAD_ACCESS KERN_INVALID_ADDRESS when accessing an NSManagedObject's Property 【发布时间】: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 个并通过另一个访问,您可能会遇到麻烦。 【参考方案1】:

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

【讨论】:

以上是关于访问 NSManagedObject 的属性时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中访问 NSManagedObject 属性

CoreData:第一次加载 NSManagedObject 时未访问自定义属性访问器

核心数据:访问 NSManagedObject 属性时应用程序崩溃

Swift 在访问 NSManagedObject 的属性时给出错误线程 1:EXC_BAD_ACCESS(code=1, address=0x0)

在 migratePersistentStore: 到 OS X 10.9 Mavericks 上的另一个 URL 后访问 NSManagedObject 属性时崩溃

如何为 NSManagedObject 子类编写自定义访问器?