2017-01-03 32 views
2

我似乎得到这个错误。[NSDecimalNumber retain]:发送到释放实例0x174222220的消息,但是为什么?

*** -[NSDecimalNumber retain]: message sent to deallocated instance 0x174222220 

我第一次运行应用程序,代码执行罚款,但如果我回到那个VC,应用程序崩溃与上述消息。我做了一些研究,我认为这意味着一些NSDecimal如何发布。这很奇怪,因为我有3个其他小数点全部设置完全相同的方式工作。

的小数被存储在核心数据,然后被设置到一个标签在我侧VC的cellForIndexAt方法。

print("\(historyEntry.newAmount) new amount") 

我第一次找回正确的金额。但第二次,或者如果我尝试移动tableview应用程序与上面的消息崩溃。什么会导致小数释放自己?

编辑

我有一个CoreDataStack迅速文件,并正在创建这样的managedContext:

lazy var managedContext: NSManagedObjectContext = { 
    return self.storeContainer.viewContext 
}() 

我取的对象是这样的:

// load the data 
    let fetchRequest: NSFetchRequest<Statement> = Statement.fetchRequest() 
    fetchRequest.predicate = NSPredicate(format:"person.name == %@ AND amountOwed >= 0", personName) 

    let sort = NSSortDescriptor(key: #keyPath(Statement.amountOwed), ascending: true) 
    fetchRequest.sortDescriptors = [sort] 
    positiveFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: coreDataStack.managedContext, sectionNameKeyPath: nil, cacheName: nil) 

    do{ 
     try positiveFetchedResultsController.performFetch() 
    }catch let error as NSError{ 
     print("Fetching error: \(error), \(error.userInfo)") 
    } 
    positiveFetchedResultsController.delegate = self 

我想将我正在使用的获取对象传递给另一个ViewController并访问其属性,如下所示:

print("\(historyEntry.changeAmount) change amount") // gives me back the correct amount that was saved evrytime. 

但是这个属性的第一次

print("\(historyEntry.newAmount) new amount") // first time correct, after that error message from above. 

编辑

这里是CoreDataStack类

import Foundation 
import CoreData 

class CoreDataStack { 

    private let modelName: String 

    init(modelName: String) { 
     self.modelName = modelName 
    } 

    lazy var managedContext: NSManagedObjectContext = { 
     return self.storeContainer.viewContext 
    }() 

    private lazy var storeContainer: NSPersistentContainer = { 

     let container = NSPersistentContainer(name: self.modelName) 
     container.loadPersistentStores { (storeDescription, error) in 
      if let error = error as NSError? { 
       print("Unresolved error \(error), \(error.userInfo)") 
      } 
     } 
     return container 
    }() 

    func saveContext() { 
     guard managedContext.hasChanges else { return } 

     do { 
      try managedContext.save() 
     } catch { 
      let nserror = error as NSError 
      print("Unresolved error \(nserror), \(nserror.userInfo)") 
     } 
    } 
} 
+0

你可以设置特殊的断点,并看到 –

+0

我不知道我知道如何创建一个特殊的断点 – icekomo

+0

您的发送消息到释放实例。这就是为什么你的应用程序崩溃 –

回答

2

你有什么NSDecimalNumber属性的名称?如果任何属性名称都以“新”开头,这会混淆ARC并导致类似问题。

Apple's Introduction to ARC引用,

你不能给一个访问,与新开头的名称。这反过来说 意味着你不能,例如,声明一个名称为 的属性,除非你指定了一个不同的getter。

0

我会尝试,并确保被管理对象后崩溃当您重新输入哟时,上下文不会被重新分配和重新分配你的VC。这可以解释为什么你的MOC被释放。

除此之外,我将使“僵尸对象”下的产品/计划/编辑计划/运行/诊断,看看是否能提供一些线索。

+0

我如何检查是否正在释放托管对象上下文?我确实启用了僵尸对象,没有多大帮助,只是告诉我NSDecimal对象已被释放。 – icekomo

+0

它是不是也告诉你'NSDecimalNumber'在哪里被释放?任何有用的堆栈跟踪?关于MOC被解除分配,你应该检查你的代码以了解 - 也许你正在创建第二个MOC并将它分配给同一个引用 - 同样,尝试记录它的地址以查看它是否发生了变化...... – sergio

相关问题