随着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:] ()
日期格式化程序仍在内存中(即未释放或损坏)。我唯一能想到的是崩溃时的字符串不符合格式,但我怀疑这会使格式化程序完全崩溃。 (预先检查格式是非常简单的。)
有什么想法吗?
答案 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出现位置的简单方法...它将指定哪个方法取消分配哪个和哪个对象
答案 3 :(得分:1)
我敢打赌,你传递给日期格式化程序的字符串是过度释放的。
答案 4 :(得分:1)
我遇到了与_sigtramp发生的奇怪崩溃,这导致应用程序出现锁定但仍然在屏幕上 - 完全阻碍了真正的根本原因。
事实证明我们引入了多线程数据解析,它与主GUI线程发生冲突,试图使用NSDateFormatter解析日期。
围绕NSDateFormatter formatDate调用进行一些同步解决了问题。