[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.
我似乎遇到了这个错误。
*** -[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.