簡體   English   中英

為什么NSMutableDictionary setValue崩潰?

[英]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 總結:這應該是一個並發問題。

更有可能是其他地方的問題。 嘗試在異常上設置斷點。 這樣,Xcode就會在發生時停止。

在斷點導航器中,選擇Exception breakpoint... ,請參見下圖。

請注意,您也可以在其他異常處停止操作,如果這些異常不是錯誤。 在這種情況下,只需繼續運行即可。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM