瞬态可选NSSet崩溃并出现EXC_BAD_ACCESS错误

时间:2017-10-27 20:52:06

标签: swift core-data exc-bad-access nsset

我在Swift中有一个瞬态可选属性 addedImages ,作为托管对象中具有属性和访问者方法的一对多关系的一部分:

…
@NSManaged public var addedImages: NSSet?
…
@objc(addAddedImagesObject:)
@NSManaged public func addToAddedImages(_ value: MMImage)

@objc(removeAddedImagesObject:)
@NSManaged public func removeFromAddedImages(_ value: MMImage)

@objc(addAddedImages:)
@NSManaged public func addToAddedImages(_ values: NSSet)

@objc(removeAddedImages:)
@NSManaged public func removeFromAddedImages(_ values: NSSet)
…

失败的代码在串行队列中运行,并因 EXC_BAD_ACCESS 错误而崩溃。

let backgroundContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)
backgroundContext.performAndWait {
  print("\(self.addedImages?.count ?? 0) added images")
  self.addToAddedImages(image)
}

当我将 addedImages 定义为非瞬态时,它没有问题。 我不确定这是否是正常行为,以及我如何解决这个问题。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我假设在创建和获取期间使用nil初始化transient属性是错误的。当我尝试访问 count 时,该对象根本就不在内存中。 我必须将此添加到 awakeFromFetch awakeFromInsert ,这可以。

if self.addedImages == nil {
  self.addedImages = nil
}