2016-07-27 5 views
0

NSDictionaryからオブジェクトを取得しようとすると、私はかなり困惑します。 objectForKeyを呼び出すとEXC_BAD_ACCESSと表示されます。与えられたオブジェクトを見ると、すべてが問題ありません。辞書が存在します。それは私が探している鍵を含んでいます。キーもそこにあります。すべてがまったく問題ありません。この機会になぜobjectForKeyがクラッシュするのですか?私はコードとコンソールの両方のスクリーンショットを撮った。あなたは問題のプロパティをプリントアウトで見ることができる。キーはそこにあり、辞書にはそのキーが含まれています。しかし、その辞書は存在しないか、何か?うんざりするちなみに私は辞書をコピーしてクラッシュを修正しようとしていましたが、通常はそうしませんでした。NSDictionary objectForKeyを実行中にEXC_BAD_ACCESSが発生しますが、オブジェクトはそこにあります

Screenshot of Xcode with crash

+0

'self.downloadProgress'プロパティは' NSDictionary'です。所有権属性とは何ですか?私は 'コピー'ではないと思いますよね? –

+1

ログを見るには、 'mutable'インスタンスの' __NSDictionaryM'があります。予想外の権利ですか?だからどこが変更可能になっているのかを確認して修正してください。 –

+0

これを修正するには、次のように 'copy'属性を追加するだけです:' @property(nonatomic、copy)NSDictionary * downloadProgress; 'それが役に立ちそうです。 –

答えて

0

ここでの問題は、スレッドでTODOました。私がコメントで正しく思い出されたので、NSMutableDictionaryはスレッドセーフではありません。バックグラウンドスレッドで更新され、上記のコードがメインスレッドで呼び出されていました。最も単純な解決策は、これらの呼び出しを@synchronizedでラップすることでした。すべての人のおかげで助けになりました。

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"]; 
      } 
     } 
    } 
} (
関連する問題