Мутирующий массив при чтении, не перечисляя
Если у меня есть два разных потока через GCD доступ кNSMutableArray
и один просто создает новый массив на основе изменяемого массива, в то время как другой поток удаляет записи из массива. Должен ли я ожидать, что это будет проблемой? То есть не должна быть копия, которая, как я полагаю, просто «читает»; массив, просто получить то, что происходит в массиве в этот момент? Я не перечисляю массив ни в одном потоке, но он все еще падает. Как только я удаляю процедуру чтения, она работает нормально.
Вот это «прочитано» :
dispatch_async(saveQueue, ^{
NSDictionary*tempstocks=[NSDictionary dictionaryWithDictionary:self.data];
Вылетает в этой теме с:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[9]'
Вот что происходит в другой ветке:
[self.data removeObjectForKey:item];
Я знаю, что вы не можете видоизменяться во время перечисления, но я думаю, что было бы нормально читать во время мутации, вы можете не знать, какую версию мутировавшего объекта вы получаете, но я не думаю, что это проблема, но ясно, что это так. , Возможно,dictionaryWithDictionary
Метод выполняет операцию, которая сначала видит объекты X, но к тому времени, когда процедура выполнена, она содержит объекты X-Y, таким образом, она не "захватывает" целикомself.data
словарь в одно мгновение при запускеdictionaryWithDictionary
и вместо этого перечисляетself.data
что по существу будет той же проблемой, что и мутация при перечислении?