2016-07-27 2 views
0

Я получаю довольно туманную ошибку при попытке получить объект из NSDictionary. Я получаю EXC_BAD_ACCESS при звонке objectForKey. Когда я смотрю на данные объекты, все в порядке. Словарь существует. Он содержит ключ, который я ищу. Ключ тоже есть. Все в порядке. Так почему же авария objectForKey по этому поводу? Ive сделал снимок экрана как кода, так и консоли - вы можете увидеть свойства, о которых идет речь в распечатке. Ключ есть, и словарь содержит этот ключ. Но как будто словарь не существует или что-то еще? Расстроенный. Кстати, я «скопировал» словарь в попытке исправить крах, я бы этого не делал.EXC_BAD_ACCESS при выполнении объекта NSDictionary objectForKey - но объект есть

Screenshot of Xcode with crash

+0

'self.downloadProgress' свойство' NSDictionary', ok. Каков атрибут владения собственностью? Думаю, это не «копировать», верно? –

+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"]; 
      } 
     } 
    } 
} (
Смежные вопросы