0

我在 iOS 中创建了套接字连接机制。它工作得很好。但有时(大约 1%)它会崩溃。这是崩溃日志,你知道为什么会这样吗?

Thread 0 Crashed:
0   libobjc.A.dylib                     0x3b01b5b0 _objc_msgSend + 16
1   CoreFoundation                      0x332957cf _signalEventSync + 75
2   CoreFoundation                      0x3329b623 _cfstream_solo_signalEventSync + 75
3   CoreFoundation                      0x33295507 _CFStreamSignalEvent + 327
4   CFNetwork                           0x32ffa6ff CoreWriteStreamCFStreamSupport::coreStreamWriteEvent(__CoreWriteStream*, unsigned long) + 99
5   CFNetwork                           0x32ffa0b5 CoreWriteStreamClient::coreStreamEventsAvailable(unsigned long) + 37
6   CFNetwork                           0x32ffb365 CoreStreamBase::_callClientNow() + 45
7   CFNetwork                           0x32ffb0f9 CoreStreamBase::_streamSetEventAndScheduleDelivery(unsigned long, unsigned char) + 89
8   CFNetwork                           0x32ffb4ff CoreStreamBase::_streamInterface_SignalEvent(unsigned long, CFStreamError const*) + 35
9   CFNetwork                           0x32f69b57 SocketStream::socketCallback(__CFSocket*, unsigned long, __CFData const*, void const*) + 135
10  CFNetwork                           0x32f69ab3 SocketStream::_SocketCallBack_stream(__CFSocket*, unsigned long, __CFData const*, void const*, void*) + 75
11  CoreFoundation                      0x332cfd81 __CFSocketPerformV0 + 385
12  CoreFoundation                      0x332cd683 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
13  CoreFoundation                      0x332ccf7f __CFRunLoopDoSources0 + 363
14  CoreFoundation                      0x332cbcb7 __CFRunLoopRun + 647
15  CoreFoundation                      0x3323eebd _CFRunLoopRunSpecific + 357
16  CoreFoundation                      0x3323ed49 _CFRunLoopRunInMode + 105
17  GraphicsServices                    0x36e172eb _GSEventRunModal + 75
18  UIKit                               0x35154301 _UIApplicationMain + 1121
19  Okey101Plus                         0x000e19ab main (main.m:16)
4

2 回答 2

2

看起来套接字类正试图向您的委托发送消息,而委托已成为僵尸。

与 iOS/OS X 中的大多数其他网络类不同,NSStream 类不保留它的委托,所以如果你不在某处保留它,它就会消失。然后,当该类试图告诉您的类该流具有可读取的数据或可写入的空间时,您将在 objc_msgSend 中崩溃,就像这个一样。

如果你确实保留了它,请确保在删除保留的委托之前完全拆除流,并注意你拆除的线程,以确保在主运行时没有安排回调释放委托后将触发的循环。

要么,要么您未能实现所需的委托方法。但是,这与“很少发生”位不符。:-)

于 2015-08-11T18:03:20.643 回答
1

我不太确定,但是根据您的报告,似乎在套接字上写入失败-

CoreWriteStreamCFStreamSupport::coreStreamWriteEvent(__CoreWriteStream*, unsigned long) + 99 

可能有一种方法可以避免此错误。CFNetworks 框架有一个很好的特性,叫做 CFNetDiagnostics 参考。请仔细查看苹果文档。

来自 Apple Docs: 在许多基于网络的应用程序中,可能会发生与您的应用程序无关的基于网络的错误。(它们可能意味着在这里,例如:如果接口不可用,网络连接时,您可能会在套接字上读取错误丢失)但是,大多数用户可能不知道应用程序失败的原因。CFNetDiagnostics API 让您可以快速轻松地帮助用户解决他们的网络问题,而您的工作量很少。

要通过网络诊断助手诊断问题,请调用 CFNetDiagnosticDiagnoseProblemInteractively 函数并传递网络诊断参考。清单 6-1 展示了如何将 CFNetDiagnostics 与在运行循环上实现的流一起使用。

case kCFStreamEventErrorOccurred:
        CFNetDiagnosticRef diagRef =
            CFNetDiagnosticCreateWithStreams(NULL, stream, NULL);
        (void)CFNetDiagnosticDiagnoseProblemInteractively(diagRef);
        CFStreamError error = CFReadStreamGetError(stream);
        reportError(error);
        CFReadStreamClose(stream);
        CFRelease(stream);
        break;

您可以在此处阅读更多信息 -使用网络诊断CFNetDiagnostics 参考

于 2013-07-28T09:45:36.950 回答