从不同的线程使用时,NSDateFormatter崩溃

时间:2011-02-09 12:35:06

标签: ios objective-c multithreading nsdateformatter exc-bad-access

随着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:] ()

日期格式化程序仍在内存中(即未释放或损坏)。我唯一能想到的是崩溃时的字符串不符合格式,但我怀疑这会使格式化程序完全崩溃。 (预先检查格式是非常简单的。)

有什么想法吗?

5 个答案:

答案 0 :(得分:44)

感谢先前的回答者。

这不是内存问题。结果证明是同步问题。 NSDateFormatter不是线程安全的;有一个后台线程试图同时使用相同的格式化程序(因此随机性)。

希望这可以帮助将来的某个人!

答案 1 :(得分:4)

另一种解决方案是序列化使用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];
});

答案 2 :(得分:1)

当您使用任何解除分配的对象时,将发生EXCBADACCESS ... 尝试使用NSZombie ..这是一种查找EXCBADACCESS出现位置的简单方法...它将指定哪个方法取消分配哪个和哪个对象

请参阅此链接http://www.markj.net/iphone-memory-debug-nszombie/

答案 3 :(得分:1)

我敢打赌,你传递给日期格式化程序的字符串是过度释放的。

答案 4 :(得分:1)

我遇到了与_sigtramp发生的奇怪崩溃,这导致应用程序出现锁定但仍然在屏幕上 - 完全阻碍了真正的根本原因。

事实证明我们引入了多线程数据解析,它与主GUI线程发生冲突,试图使用NSDateFormatter解析日期。

围绕NSDateFormatter formatDate调用进行一些同步解决了问题。