Сбой 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:] ()
Форматировщик даты все еще находится в памяти (т.е. не выпущен или поврежден). Единственное, о чем я могу думать, это то, что строки при сбое не соответствуют формату, но я сомневаюсь, что это приведет к краху форматирования. (нетривиально проверить формат заранее).
Любые мысли?
Ответы
Ответ 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, разрешили проблемы.