当从不同的线程使用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:] () 

date格式化程序仍然在内存中(即不释放或损坏)。 我唯一能想到的是在崩溃时的string不符合格式,但我怀疑这会使格式化程序完全崩溃。 (事先检查格式是不重要的)。

有什么想法吗?

感谢以前的答复者。

这不是一个记忆问题。 原来是同步问题。 NSDateFormatter不是线程安全的; 有一个后台线程试图同时使用相同的格式化程序(因此随机性)。

希望这有助于未来的人!

另一个解决scheme是序列化使用NSDateFormatter的代码或任何其他非线程安全的对象的执行。 使用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]; }); 

EXCBADACCESS会发生在你使用任何释放的对象时…尝试使用NSZombie ..这是一个简单的方法来findEXCBADACCESS发生的地方…它将指定哪个方法哪里和哪个对象被释放

看到这个链接http://www.markj.net/iphone-memory-debug-nszombie/

我敢打赌,你传递给date格式化程序的string是过度发布的。

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

事实certificate,我们引入了multithreading数据parsing,它与使用NSDateFormatterparsingdate的主GUI线程相冲突。

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