我正在使用单例类从CoreData中选择数据,并将其发送回调用的ViewController。我的问题是,在获取 ManagedObject 的属性之一时,应用程序崩溃并出现EXC_BAD_ACCESS异常。
这似乎只发生在iOS 9.x或模拟器上,但在这些上非常一致。这在运行 10.x 的设备上没有发生过。我将方案诊断设置为显示僵尸对象,现在出现以下错误:
-[CFString copy]: message sent to deallocated instance 0x15b92990
问题是被引用的字符串在我收到此错误之前直接检索的对象上,并且我使用的是 Swift(所以没有手动解除分配任何东西),所以我不明白为什么它被解除分配。
选择对象的代码如下所示:
func getModelTypePrice(mmCode: String, year: Int) -> ModelTypePrice? {
let request = NSFetchRequest<ModelTypePrice>(entityName: "ModelTypePrice")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [NSPredicate(format: "mmcode = %@", mmCode),
NSPredicate(format: "reg_year = %d", year)])
do {
let prices = try managedContext.fetch(request)
if prices.count == 1 {
return prices[0]
}
} catch {
print("Error selecting object: (error)")
}
return nil
}
这是从视图控制器调用的,其用法如下:
if let price = LibraryAPI.sharedInstance.getModelTypePrice(mmCode: "123", year: 2017) {
self.newPrice = price.new_price // Error happens here.
}
ViewController 确实有一个名为 newPrice 的可选字符串属性。模型类型价格上的new_price属性也是一个可选的字符串。 我在这里有点不知所措,所以任何建议或建议将不胜感激。
这修复了它:[CFNumber release]:发送到已释放实例的消息
问题是以new
开头的托管对象的属性名称(new_price
)。将其更改为price_new
修复它。显然,他们改变了iOS 10.x中的处理方式,因为这从来都不是问题。
也许这为其他人节省了一些挫败感。