[英]Why NSMutableDictionary setValue crashes?
setValue(_:forKey:)
方法有時會崩潰。 我們的NSMutableDictionary
僅從主線程編寫,但是經常可以訪問。 頻繁訪問字典會導致崩潰嗎?
我猜想使用Core Data
更改數據會更可靠,但是我們決定使用基於字典的持久性存儲。 有什么辦法可以使我們的NSMutableDictionary
訪問更加可靠?
無論如何,如果它們在循環中執行,我怎么知道哪個setValue
方法崩潰了? 如果我打印keyPath
,將在崩潰發生之前到達循環的結尾,因此我無法縮小哪個setValue
調用確切導致崩潰的發生。
如果我對它的理解正確,那么您的設置將是這樣的:僅在主線程上寫入,而從其他線程讀取。 使用此設置:
let a = NSMutableDictionary()
let time = DispatchTime.now() + 0.01
DispatchQueue.global().asyncAfter(deadline: time) {
for _ in 0..<10000000000000 {
let b = self.a["\(self.a.count - 1)"]
print(b)
}
}
for index in 0..<1000000000000000 {
a.setValue(NSNumber(value: index), forKey: "\(index)")
}
我確實能夠重現您的問題。 這是崩潰發生時的堆棧跟蹤:
Thread 1 Queue : com.apple.main-thread (serial)
#0 0x00000001115286f6 in _kernelrpc_mach_vm_deallocate_trap ()
#1 0x0000000111530a43 in mach_vm_deallocate ()
#2 0x00000001112c8477 in mvm_deallocate_pages ()
#3 0x00000001112bfdc4 in free_large ()
#4 0x000000010cc5506b in mdict_rehashd ()
#5 0x000000010cac26c6 in -[__NSDictionaryM setObject:forKey:] ()
#6 0x000000010b9382f5 in ViewController.viewDidLoad() at
Thread 5 Queue : com.apple.root.default-qos (concurrent)
#0 0x000000010cafc454 in -[__NSDictionaryM objectForKey:] ()
#1 0x000000010d11567b in NSMutableDictionary.subscript.getter ()
#2 0x000000010d115588 in @objc NSDictionary.subscript.getter ()
#3 0x000000010b93898d in closure #1 in ViewController.viewDidLoad() at
從主線程上的釋放,我猜setValue
在字典上引起了一些重新存儲,並且在讀取的同時,它嘗試讀取釋放的內存-> EXC_BAD_ACCESS
。 總結:這應該是一個並發問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.