我在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)
答案 0 :(得分:2)
看起来套接字类正在尝试向您的委托发送消息,并且该委托已成为僵尸。
与iOS / OS X中的大多数其他网络类不同,NSStream类不保留其委托,因此如果您不将其保留在某个地方,它将会消失。然后,当类试图告诉你的类流有读取数据或写入空间时,你会在objc_msgSend中崩溃,就像这个一样。
如果你确实保留了它,请确保在摆脱保留的代理之前完全拆除流,并小心你要拆除的线程,以确保没有安排回调释放委托后将触发的主运行循环。
或者您未能实现所需的委托方法。但是,这与“很少发生”位不符。 : - )
答案 1 :(得分:1)
我真的不太确定,但根据你的报告,看起来写套接字失败了 -
CoreWriteStreamCFStreamSupport::coreStreamWriteEvent(__CoreWriteStream*, unsigned long) + 99
可能有一种方法可以避免这种错误。 CFNetworks Framework有一个很好的功能,称为CFNetDiagnostics参考。请仔细查看苹果文档。
来自Apple文档: 在许多基于网络的应用程序中,可能会出现与您的应用程序无关的基于网络的错误。(它们可能在这里意味着:例如:如果接口变得不可用,当网络连接丢失时,您可以在套接字上获得读取错误) ,大多数用户可能不知道应用程序失败的原因。 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;
您可以在此处阅读更多内容 - Using Network Diagnostics,CFNetDiagnostics Reference