2017-01-03 5 views
2

このエラーが発生しているようです。[NSDecimalNumber retain]:解放されたインスタンス0x174222220にメッセージが送信されましたが、なぜですか?

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

私はアプリを初めて実行すると、コードが細かい実行されますが、私は戻ってそのVCになった場合は、上記のメッセージでアプリがクラッシュします。私はいくつかの研究を行いました。NSDecimalがどのようにリリースされているのかということを意味していると思います。非常に奇妙です.3つの小数点以下の桁がすべて同じ方法で設定されています。

小数はCore Dataに格納されていて、cellForIndexAtメソッドの側でVC内のラベルに設定されています。

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

初めて正確な金額を返す。しかし、2回目、または私がテーブルビューを移動しようとすると、上記のメッセージでアプリがクラッシュします。何が小数点自体を解放する原因になりますか?

EDIT

私は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. 

EDIT

初めて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プロパティの名前は何ですか?いずれかのプロパティ名が "new"で始まる場合、ARCを混乱させ、このような問題につながります。あなたはアクセサに新しいで始まる名前を与えることができないApple's Introduction to ARC

から引用し

。たとえば、 は、異なるゲッターを指定しない限り、 の名前がnewで始まるプロパティを宣言することはできません。

0

後、私がしようとすると、管理対象オブジェクトことを確認してくださいでしょうがクラッシュコンテキストが割り当て解除されておらず、再入力したときに再割り当てされるウルVC。あなたのMOCがなぜ割り当て解除されたのか説明できます。

それ以外は、Product/Scheme/Edit Scheme/Run/Diagnosticsの下にある "Zombie Objects"を有効にして、さらにヒントを提供するかどうかを確認します。

+0

管理対象オブジェクトのコンテキストが割り当て解除されているかどうかを確認するにはどうすればよいですか?私はゾンビオブジェクトを有効にしましたが、NSDecimalオブジェクトの割り当てが解除されていると言っても大したことはありませんでした。 – icekomo

+0

NSDecimalNumberがどこから割り当て解除されているかを教えてくれませんか?任意の有用なスタックトレース? MOCの割り当てを解除するには、コードを調べて、2番目のMOCを作成して同じ参照に割り当てることもできます。また、アドレスが変更されたかどうかを記録してみてください... – sergio

関連する問題