发送到已释放实例 Core Data 的消息

Posted

技术标签:

【中文标题】发送到已释放实例 Core Data 的消息【英文标题】:Message sent to deallocated instance Core Data 【发布时间】:2016-04-13 16:31:26 【问题描述】:

尝试向 Core Data 添加字符串时出现标题错误。这是我的代码:

 func save(name: String) 
        let model = CoreDataModel(modelName: modelName, modelBundle: modelBundle!, storeType: .SQLite(DocumentsDirectoryURL()))
        let factory = CoreDataFactory(model: model)

        let context = factory.createContext()
        let entity = NSEntityDescription.entityForName("Transaction", inManagedObjectContext: context)
        let transaction = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: context)

        transaction.setValue(name, forKey: "name")

        do 
            try context.save()
            transactions.append(transaction)
        catch let error as NSError 
            print(error)
        
    


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
   let cell = tableView.dequeueReusableCellWithIdentifier("Cell")

   let transaction = transactions[indexPath.row]
   print(transaction)
   cell!.textLabel!.text = transaction.valueForKey("name") as? String 

   return cell!

错误在这一行:

cell!.textLabel!.text = transaction.valueForKey("name") as? String 

这是完整的错误描述:

<NSManagedObject: 0x7f9d5c216a90> (entity: <null>; id: 0xd000000000040000 <x-coredata://442A125F-AB41-4CA3-AAA5-A5C59840D5EE/Transaction/p1> ; data: <fault>)
2016-04-13 19:25:29.207 Project1[22981:2242560] *** -[NSEntityDescription _entityClass]: message sent to deallocated instance 0x7f9d5c2089e0

有人知道我为什么会得到这个吗?

【问题讨论】:

您可能应该在每次更新后从数据存储中的提取中填充您的事务数组,而不是将刚刚创建的托管对象附加到它。 稍后会这样做,但现在尝试在添加第一项时解决此问题。 【参考方案1】:

问题似乎是我在本地创建了NSManagedObjectContext 以保存(),我必须将前3 行移至ViewDidLoad,并将context 声明为类成员。

This 线程帮我弄清楚了。

【讨论】:

这就是我的意思:))

以上是关于发送到已释放实例 Core Data 的消息的主要内容,如果未能解决你的问题,请参考以下文章

[UIImageAsset 保留]:发送到已释放实例的消息

发送到已释放实例问题的消息

[UINavigationController 保留]:发送到已释放实例的消息

发送到已释放实例的消息

tableView:didSelectRowAtIndexPath - 发送到已释放实例的消息

[NSDecimalNumber 保留]:消息发送到已释放实例 0x174222220,但为啥呢?