Подтвердить что ты не робот

Сбой NSDateFormatter при использовании из разных потоков

Мы продолжаем получать случайный, странный сбой с NSDateFormatter. Соответствующая трассировка стека:

Program received signal:  "EXC_BAD_ACCESS".
#0  0x00000005 in ?? ()
#1  0x0213e3c3 in udat_parse ()
#2  0x01d4e1ca in CFDateFormatterGetAbsoluteTimeFromString ()
#3  0x01d4e225 in CFDateFormatterCreateDateFromString ()
#4  0x003e2608 in getObjectValue ()
#5  0x003e2921 in -[NSDateFormatter getObjectValue:forString:errorDescription:] ()
#6  0x003e21cd in -[NSDateFormatter dateFromString:] ()

Форматировщик даты все еще находится в памяти (т.е. не выпущен или поврежден). Единственное, о чем я могу думать, это то, что строки при сбое не соответствуют формату, но я сомневаюсь, что это приведет к краху форматирования. (нетривиально проверить формат заранее).

Любые мысли?

4b9b3361

Ответ 1

Благодаря предыдущим ответчикам.

Это не проблема памяти. Это оказалось проблемой синхронизации. NSDateFormatter не являются потокобезопасными; был фоновый поток, пытающийся использовать один и тот же форматтер в одно и то же время (отсюда и случайность).

Надеюсь, это поможет кому-то в будущем!

Ответ 2

Другим решением было бы сериализовать выполнение кода, который использует NSDateFormatter s или любые другие объекты, не являющиеся потоками. Используя Grand Central Dispatch, вы можете нажать код на main_queue:

dispatch_async(dispatch_get_main_queue(), ^(void){
  [some_object some_message];
});

или использовать приватную очередь для достижения такого же эффекта:

dispatch_queue_t dispatch_queue = dispatch_queue_create("com.MyApp.serializer",NULL);
dispatch_async(dispatch_queue, ^(void){
  [some_object some_message];
});

Ответ 3

EXCBADACCESS будет возникать при использовании любого освобожденного объекта... Попробуйте использовать NSZombie.. Это простой способ найти, где происходит EXCBADACCESS... Он укажет, какой метод, где и какой объект будет освобожден

Смотрите эту ссылку http://www.markj.net/iphone-memory-debug-nszombie/

Ответ 4

Моя ставка заключается в том, что строка, которую вы передаете в формат даты, перевыпускается.

Ответ 5

У меня возникали странные сбои с _sigtramp, которые заставляли приложение казаться заблокированным, но все еще на экране - полностью препятствуя реальной первопричине.

Оказалось, что мы ввели многопоточный анализ данных, который столкнулся с основным потоком GUI, пытаясь разобрать даты, используя NSDateFormatter.

Помещая некоторую синхронизацию вокруг NSDateFormatter formatDate, разрешили проблемы.