NSDateFormatter crashes when used from different threads

前端 未结 5 1694
傲寒
傲寒 2020-12-15 05:58

We keep getting a random, weird crash with NSDateFormatter. The relevant stack trace is:

Program received signal:  “EXC_BAD_ACCESS”.
#0  0x00000         


        
相关标签:
5条回答
  • 2020-12-15 06:38

    EXCBADACCESS will occur when you use any deallocated object... Try to use NSZombie.. It is a easy way to find where the EXCBADACCESS occurs... It will specify which Method where and which object gets deallocated

    See this Link http://www.markj.net/iphone-memory-debug-nszombie/

    0 讨论(0)
  • 2020-12-15 06:44

    Thanks to the previous answerers.

    This was not a memory problem. It turned out to be a synchronization issue. NSDateFormatters are not thread safe; there was a background thread attempting to use the same formatter at the same time (hence the randomness).

    Hope this helps someone in the future!

    0 讨论(0)
  • 2020-12-15 06:46

    My bet is that the string you pass in to the date formatter is over-released.

    0 讨论(0)
  • 2020-12-15 06:49

    I was experiencing weird crashes with _sigtramp which caused to application to appear locked up but still on the screen - completely obstructing the real root cause.

    It turned out indeed that we introduced multi-thread data parsing which collided with the main GUI thread trying to parse dates using NSDateFormatter.

    Putting some synchronization around the NSDateFormatter formatDate calls resolved the issues.

    0 讨论(0)
  • 2020-12-15 06:50

    Another solution would be to serialize the execution of the code that uses NSDateFormatters, or any other non-thread-safe objects. Using Grand Central Dispatch you can push the code on the main_queue:

    dispatch_async(dispatch_get_main_queue(), ^(void){
      [some_object some_message];
    });
    

    or use a private queue to achieve the same effect:

    dispatch_queue_t dispatch_queue = dispatch_queue_create("com.MyApp.serializer",NULL);
    dispatch_async(dispatch_queue, ^(void){
      [some_object some_message];
    });
    
    0 讨论(0)
提交回复
热议问题