2016-07-27 41 views
0

Ich bekomme einen ziemlich verwirrenden Fehler beim Versuch, ein Objekt von einem NSDictionary zu bekommen. Ich bekomme eine EXC_BAD_ACCESS beim Anruf objectForKey. Wenn ich die gegebenen Objekte anschaue, ist alles in Ordnung. Das Wörterbuch existiert. Es enthält den Schlüssel, den ich suche. Der Schlüssel ist auch da. Alles ist völlig in Ordnung. Warum stürzt objectForKey bei dieser Gelegenheit ab? Ich habe einen Screenshot des Codes und der Konsole gemacht - Sie können die betreffenden Eigenschaften im Ausdruck sehen. Der Schlüssel ist da und das Wörterbuch enthält diesen Schlüssel. Aber als ob das Wörterbuch nicht existiert oder so? Verdutzt. Übrigens habe ich das Wörterbuch kopiert, um den Absturz zu beheben. Normalerweise würde ich das nicht machen.EXC_BAD_ACCESS beim Ausführen von NSDictionary objectForKey - aber das Objekt ist dort

Screenshot of Xcode with crash

+0

'Self.downloadProgress' -Eigenschaft ist ein' NSDictionary', ok. Was ist das Eigentumsrecht? Ich denke, es ist nicht "Kopie", oder? –

+1

Schauen Sie genau hin, um zu loggen - Sie haben ein '__NSSDictionaryM' - das ist" veränderbare "Instanz. Ziemlich unerwartet, oder? Überprüfen Sie also, wo es veränderbar wird, und beheben Sie es. –

+0

Um es zu beheben, fügen Sie einfach das 'copy' Attribut wie folgt hinzu:' @property (nicht atomisch, kopieren) NSDictionary * downloadProgress; 'Ich hoffe, es wird Ihnen helfen. –

Antwort

0

Das hier Problem mit Threading wurde todo. Wie ich in Kommentaren richtig erinnert wurde, ist NSMutableDictionary nicht threadsicher. Es wurde in einem Hintergrundthread aktualisiert und der obige Code wurde im Hauptthread aufgerufen. Die einfachste Lösung bestand darin, diese Anrufe in @synchronized zu verpacken. Danke an alle, die geholfen haben.

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"]; 
      } 
     } 
    } 
} (