NSURLConnection上无法解释的崩溃

时间:2015-04-04 08:50:08

标签: ios multithreading crash nsmutablearray nsurlconnection

我遇到了以下崩溃:

Exception Type:  00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread:  0

Application Specific Information:
com.[app name].[app name] failed to scene-update in time

Elapsed total CPU time (seconds): 5.050 (user 5.050, system 0.000), 24% CPU 
Elapsed application CPU time (seconds): 0.044, 0% CPU

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x0000000195018e48 semaphore_wait_trap + 8
1   libdispatch.dylib               0x0000000194efbf3c _dispatch_semaphore_wait_slow + 252
2   CFNetwork                       0x00000001832a2220 CFURLConnectionSendSynchronousRequest + 284
3   CFNetwork                       0x00000001832c27c8 +[NSURLConnection sendSynchronousRequest:returningResponse:error:] + 116
4   Foundation                      0x0000000184726358 -[NSData(NSData) initWithContentsOfURL:options:error:] + 308
5   Foundation                      0x0000000184726204 +[NSData(NSData) dataWithContentsOfURL:options:error:] + 72
6   [app name]                      0x00000001000b1a30 0x100090000 + 137776
7   [app name]                      0x00000001001e3f44 0x100090000 + 1392452
8   libdispatch.dylib               0x0000000194eed990 _dispatch_call_block_and_release + 20
9   libdispatch.dylib               0x0000000194eed950 _dispatch_client_callout + 12
10  libdispatch.dylib               0x0000000194ef2208 _dispatch_main_queue_callback_4CF + 1604
11  CoreFoundation                  0x00000001838962e8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
12  CoreFoundation                  0x0000000183894390 __CFRunLoopRun + 1488
13  CoreFoundation                  0x00000001837c11f0 CFRunLoopRunSpecific + 392
14  GraphicsServices                0x000000018cae36f8 GSEventRunModal + 164
15  UIKit                           0x0000000188152108 UIApplicationMain + 1484
16  [app name]                      0x00000001000dd2ac 0x100090000 + 316076
17  libdyld.dylib                   0x0000000194f1aa04 start + 0

在以下代码中:

    @try {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^(void) {
            NSData* data = [NSData dataWithContentsOfURL:xxxxxxx options:NSDataReadingUncached error:&error];
           ...
          [self.buffer performSelectorOnMainThread:@selector(addObject:) withObject:data waitUntilDone:YES];
   }
    @catch (NSException* error) {
        NSLog(@"error: %@", error);
    }

是的,也有一个失败块,但我将代码简化为本质,导致崩溃的纯代码。

此代码每小时运行数百次,没有任何问题。但是它时不时地崩溃。总是一样的崩溃(如上面那个)。首先,应用程序冻结,然后崩溃。永远不会执行catch-block。

performSelectorOnMainThread使用一个对象。并且该对象(在主线程中)被添加到NSMutableArray(self.buffer是NSMutableArray)。我知道NSMutableArrays不是线程安全的,这就是我在主线程上执行它们的原因。对于waitUntilDone,我使用YES来防止线程在插入对象之前结束。我也没用,但是不断崩溃。

有没有人知道为什么会发生这种崩溃?你可能有一个解决方案让我阻止这个吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

在更新UI时,您正在主线程上进行网络i / o。这需要太长时间。不要在主线程上这样做。相反,使用异步方式运行URL提取并缓存结果,以便下次用户界面更新可以使用它。

更多信息:

https://developer.apple.com/library/ios/qa/qa1693/_index.html

答案 1 :(得分:0)

在主线程上写入数组并不会使线程安全。使用专用的dispatch_queue来控制对nsmutablearray的访问,包括读取和写入操作。

https://stackoverflow.com/a/4607664/573988