访问 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 属性时崩溃