【问题标题】:Receiving EXC_BAD_ACCESS exception接收 EXC_BAD_ACCESS 异常
【发布时间】:2017-06-14 17:39:41
【问题描述】:

我正在使用单例类从 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
}

从 ViewController 调用,用法如下:

if let price = LibraryAPI.sharedInstance.getModelTypePrice(mmCode: "123", year: 2017) {
    self.newPrice = price.new_price // Error happens here.
}

ViewController 确实有一个可选的 String 属性,称为 newPrice。 ModelTypePrice 上的 new_price 属性也是一个可选字符串。 我在这里有点茫然,所以任何建议或建议将不胜感激。

【问题讨论】:

  • 价格价值是多少?
  • 在 getModelTypePrice 中,如果我在返回之前打印出来,我会得到以下信息:prices[0].new_price: Optional("369737")
  • 试试这个... self.newPrice = prices.new_price!
  • @Bala 刚试过,没有任何作用。但是这两个变量都是可选的字符串,所以我不需要。我也试过price.new_price == nil ? "0" : price.new_price!,但结果相同。
  • 如何声明变量 newPrice?

标签: ios swift core-data


【解决方案1】:

这修复了它:[CFNumber release]: message sent to deallocated instance

问题是托管对象的属性名称以new 开头(它是new_price)。将其更改为price_new 修复了它。显然,他们改变了在 iOS 10.x 中的处理方式,因为它从来都不是问题。

也许这可以为其他人节省一些挫败感。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多