[NSDecimalNumber retain]: message sent to deallocated instance 0x174222220, 但为什么呢?

[NSDecimalNumber retain]: message sent to deallocated instance 0x174222220, but why?

我似乎遇到了这个错误。

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

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

小数存储在 Core Data 中,然后在我的 VC 中的 cellForIndexAt 方法中设置为标签。

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

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

编辑

我有一个 CoreDataStack swift 文件,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 class

    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)")
        }
    }
}

我会尝试确保当您重新进入 VC 时,托管对象上下文不会被释放和重新分配。这可以解释为什么你的 MOC 被解除分配。

除此之外,我会在 Product/Scheme/Edit Scheme/Run/Diagnostics 下启用 "Zombie Objects" 并查看是否提供更多提示。

您的 NSDecimalNumber 属性的名称是什么?如果任何 属性 名称以 "new" 开头,那将混淆 ARC 并导致这样的问题。

引用自Apple's Introduction to ARC,

You cannot give an accessor a name that begins with new. This in turn means that you can’t, for example, declare a property whose name begins with new unless you specify a different getter.