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

ソケット クラスがデリゲートにメッセージを送信しようとしていて、デリゲートがゾンビになっているようです。

NSStream クラスは、iOS/OS X の他のほとんどのネットワーク クラスとは異なり、デリゲートを保持しないため、どこかに保持しないと消えてしまいます。次に、ストリームに読み取り用のデータまたは書き込み用のスペースがあることをクラスがクラスに伝えようとすると、このような 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;

ここで詳細を読むことができます - Using Network Diagnostics , CFNetDiagnostics Reference

于 2013-07-28T09:45:36.950 に答える