当从不同的线程使用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发生的地方…它将指定哪个方法哪里和哪个对象被释放
我敢打赌,你传递给date格式化程序的string是过度发布的。
_sigtramp导致应用程序出现locking,但仍然在屏幕上,我遇到了奇怪的崩溃 – 完全阻碍了真正的根本原因。
事实certificate,我们引入了multithreading数据parsing,它与使用NSDateFormatterparsingdate的主GUI线程相冲突。
围绕NSDateFormatter formatDate调用进行一些同步解决了这些问题。