2016-07-27 116 views
0

當試圖從NSDictionary獲取對象時,我得到一個相當莫名其妙的錯誤。致電objectForKey時,我收到EXC_BAD_ACCESS。當我看着給定的對象時,一切都很好。字典存在。它包含我正在尋找的鑰匙。關鍵也在那裏。一切都很好。那麼爲什麼objectForKey在這種情況下會崩潰?我截取了代碼和控制檯的截圖 - 您可以在打印輸出中看到有問題的屬性。密鑰在那裏,字典包含該密鑰。但它好像字典不存在或什麼?百思不得其解。順便說一句,我'複製'字典,試圖修復崩潰,我通常不會這樣做。EXC_BAD_ACCESS while NSDictionary objectForKey - 但對象是那裏

Screenshot of Xcode with crash

+0

'self.downloadProgress'屬性是'NSDictionary',好的。什麼是財產所有權屬性?我想這不是「複製」,對吧? –

+1

仔細觀察日誌 - 你有一個'__NSDictionaryM' - 這是'mutable'實例。相當意外的權利?因此,檢查它變得可變並修復它。 –

+0

要修復它只是像這樣添加'copy'屬性:'@property(nonatomic,copy)NSDictionary * downloadProgress;'希望它會有所幫助。 –

回答

0

這裏的問題與線程待辦事項。正如我在評論中正確提醒的那樣,NSMutableDictionary不是線程安全的。它正在後臺線程上更新,上面的代碼在主線程中被調用。最簡單的解決方案是將這些調用包裝在@synchronised中。感謝所有參與幫助的人。

if ([update uniqueId]) { 
    @synchronized (self.downloadProgress) { 
     if ([self.downloadProgress objectForKey:[update uniqueId]]) { 
      NSDictionary *progressInfo = [[self.downloadProgress objectForKey:[update uniqueId]] copy]; 
      if ([progressInfo objectForKey:@"progressString"]) { 
       return [progressInfo objectForKey:@"progressString"]; 
      } 
     } 
    } 
} (