當我從數據庫中刪除NSMangedObject
時,分配給它的局部變量會發生什麼?存儲對已刪除引用的局部變量會發生什麼情況NSManagedObjects
例如,我有一個簡單的NSManagedObject:
class MyManagedObject: NSManagedObject {
@NSManaged var name: String
}
然後在我的ViewController,我拉出來的數據庫,並在本地指派方式:
class ViewController: UIViewController {
var myManagedObject: MyManagedObject!
}
然後我刪除它來自數據庫。
如果打印對象的名字,我在控制檯中
print("myManagedObject.name = \(myManagedObject.name)")
//prints: "myManagedObject.name = "
以下彷彿對象,不是嗎?但是如果我把變量變成可選的並且檢查它爲零,我被告知它不是零。
我不太清楚如何在腦海中調和這一點。似乎有東西指向局部變量,但其屬性已消失。
如果我有許多不同的UI對象依賴於該對象的屬性,我不能假設它在內存中有一些本地深層副本?
這裏比較完整的代碼:
在viewDidLoad中創建新的對象,保存上下文,獲取對象,然後將其指定本地。
class ViewController: UIViewController {
var myManagedObject: MyManagedObject!
override func viewDidLoad() {
super.viewDidLoad()
//1 Create the new object
let newObject = NSEntityDescription.insertNewObject(forEntityName: "MyManagedObject", into: coreDataManager.mainContext) as! MyManagedObject
newObject.name = "My First Managed Object"
//2 Save it into the context
do {
try coreDataManager.mainContext.save()
} catch {
//handle error
}
//3 Fetch it from the database
let request = NSFetchRequest<MyManagedObject>(entityName: "MyManagedObject")
do {
let saved = try coreDataManager.mainContext.fetch(request)
//4 Store it in a local variable
self.myManagedObject = saved.first
} catch {
//handle errors
}
}
}
在這一點上,如果我打印出局部變量的name
財產,我得到正確的響應:
print("The object's name is: \(myManagedObject.name)")
//prints: The object's name is: My First Managed Object
所以,現在我從數據庫中刪除:
if let storedObject = myManagedObject {
coreDataManager.mainContext.delete(storedObject)
do {
try coreDataManager.mainContext.save()
} catch {
//handle error
}
}
但現在,當我打印時,我得到最奇怪的輸出:
print("myManagedObject.name = \(myManagedObject.name)")
//prints: "myManagedObject.name = "
這完全不是我期待記憶工作的方式。如果我創建類Foo
的實例,然後將該實例傳遞給不同的對象,則它是相同的實例。一旦沒有人指出它,它就會消失。
在這種情況下---什麼是變量,myManagedObject
?這不是nil
。什麼是字符串,name
?它是一個空字符串嗎?還是它是一些其他奇怪的元類型?
顯示代碼,你「分配」在本地。 var myManagedObject:MyManagedObject!將只是「創造」一個類型爲MyManagedObject的新變量 – Retterdesdialogs
由於您的問題更新:刪除託管對象後,您將其標記爲已刪除,保存數據庫後,將其從數據庫(不在內存中)中刪除。在託管對象上,您應該檢查isDeleted屬性或甚至「fault」屬性。該對象按照您的預測持續存在,但其行爲在您的情況下是不可預測的。任何事情都可能發生,取決於框架的變化,空字符串似乎是一個很好的解決方法,它仍然可以工作。刪除後不要使用這個對象是你的工作。 –
但兔子洞更深。如果您使用多個上下文,並且您在一個上下文中刪除該對象,它仍然會存在於另一個上下文中。但是,一旦您嘗試在第二個環境中應用更改,就會報告您需要解決的衝突。因此,在內存中,每個上下文都有一個實例,這些實例將保存在內存中,直到ARC規則決定釋放它爲止。但其性能隨時可能發生變化。對象仍然存在但其屬性無法訪問。通過一切權利它應該崩潰,但它似乎是例外爲您處理。 –