官方翻译:
异常调用栈
Thread 0:0 libSystem.B.dylib 0x00001668 mach_msg_trap + 201 libSystem.B.dylib 0x00003734 mach_msg + 442 CoreFoundation 0x0002296e CFRunLoopRunSpecific + 11503 CoreFoundation 0x000224da CFRunLoopRunInMode + 424 CFNetwork 0x0002b118 CFURLConnectionSendSynchronousRequest + 2445 Foundation 0x000a45a2 +[NSURLConnection sendSynchronousRequest:returningResponse[…]6 MyBadApp 0x000063f6 0x1000 + 214947 MyBadApp 0x0000630a 0x1000 + 212588 MyBadApp 0x00006ada 0x1000 + 232589 MyBadApp 0x00003618 0x1000 + 975210 MyBadApp 0x0000351e 0x1000 + 950211 MyBadApp 0x00003874 0x1000 + 1035612 UIKit 0x00068568 -[UIViewController viewWillMoveToWindow:] + 7613 UIKit 0x0000988a -[UIView(Hierarchy) _willMoveToWindow:withAncestorView:] + 12614 UIKit 0x00005e6e -[UIView(Internal) _addSubview:positioned:relativeTo:] + 22215 UIKit 0x00005d80 -[UIView(Hierarchy) addSubview:] + 1616 MyBadApp 0x000028d2 0x1000 + 635417 UIKit 0x00003e58 -[UIApplication _performInitializationWithURL:payload:] + 33618 UIKit 0x00003b22 -[UIApplication _runWithURL:payload:launchOrientation:] + 39419 UIKit 0x0004f8c4 -[UIApplication handleEvent:withNewEvent:] + 133620 UIKit 0x0004f242 -[UIApplication sendEvent:] + 3821 UIKit 0x0004ec8c _UIApplicationHandleEvent + 477222 GraphicsServices 0x00003b2c PurpleEventCallback + 66023 CoreFoundation 0x00022d96 CFRunLoopRunSpecific + 221424 CoreFoundation 0x000224da CFRunLoopRunInMode + 4225 UIKit 0x0000340a -[UIApplication _run] + 34226 UIKit 0x00001954 UIApplicationMain + 63627 MyBadApp 0x00002828 0x1000 + 618428 MyBadApp 0x000027f8 0x1000 + 6136
看看栈的5、6行,你能看到应用程序正在使用同步网络调用 (+[NSURLConnection sendSynchronousRequest:returningResponse:error:]) 已经被阻塞并等待网络,thereby invoking the ire of the watchdog.
一旦你确认了这个问题和你的网络代码相关,通常有两种解决方案:
- 异步网络 - 解决这个问题最好的方法就是异步运行你的网络代码,异步网络代码有很多优点,不只是让你安全的访问网络,不用担心线程。
- 在第二线程同步网络操作 - 如果异步运行网络代码非常困难(假如你使用了大量基于同步网络的可移植代码,你能避开watchdog,在第二线程上执行同步代码)。
需要认识到隐藏在抽象层后面的同步网络操作掩盖了一个危险。
如果你用"http"或"https"URL方式调用 -[NSXMLParser -initWithContentsOfURL:],NSXMLParser会同步下载这个URL的内容。这是非常方便的,但是如果你在主线程运行它,有被看门口watchdog杀掉的风险。一个更好的选择就是异步下载URL的内容到wenjian,然后使用''file"URL调用-[NSXMLParser -initWithContentsOfURL:] 方法。这同样适用于其他"WithContentsOfURL",像+[NSString stringWithContentsOfURL:encoding:error:], -[NSDictionary initWithContentsOfURL:]等等。reachability — The System Configuration framework reachability API (<SystemConfiguration/SCNetworkReachability.h>) 默认是同步操作。因此像SCNetworkReachabilityGetFlags这种看起来没有问题的API可能使你被watchdog杀死。如果你使用了reachability API,你应该异步调用。这涉及到在run loop上使用 SCNetworkReachabilityScheduleWithRunLoop 方法去执行你的reachability 查询。