2017-01-03 82 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

相關問題