私は最近、Apple SDK(iPhone用など)を学んでいて、理解できないものを見つけました。 "Using NSURLConnection"の文書でNSURLConnectionのApple SDKドキュメントに間違いや混乱がありますか?
私は奇妙な説明とサンプルコードを発見しました。最初に、それは言う:
ダウンロードは、initWithRequest:delegate:メッセージを受信するとすぐに開始します。デリゲートがconnectionDidFinishLoading:またはconnection:didFailWithError:メッセージを受信する前にいつでも取り消すことができます。
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if (theConnection) { // Create the NSMutableData that will hold // the received data // receivedData is declared as a method instance elsewhere receivedData=[[NSMutableData data] retain]; } else { // inform the user that the download could not be made }
だから、ダウンロードは、すぐtheConnectionが初期化されるよう別のスレッドですぐに開始しなければならないように私には思える:
次に、それは以下のコードを示します。これは、コードが非ブロックであり、デリゲート(この場合はself)にメッセージを返信するため、明らかです。しかし、の後にreceivedDataの(自動解放スタイルの)割り当てがになると、他のスレッドが開始されます。これは安全でない競争状態ではありませんか?非常に高速なサーバ応答(ループバックデバイスなど)や不運なスレッドスケジューリングの場合に、クラッシュ、メモリリーク、またはデータの損失を招くことはありませんか? theConnectionが初期化される前にreceivedDataを割り当てるのが理にかなっていないでしょうか?
私はこのコードで混乱しています。誰かが私にとってそれを見せてくれることを願っています。すべての情報について おかげで、
ルディCilibrasi
これは意味があります。私の研究のために、すべての委任メッセージがメインスレッドを通じて送信されるという主張をサポートするURLを教えてください。ヘルプと情報をありがとう。 –
また、NSURLConnectionの委譲メッセージは実行ループによってマーシャリングされるため、制御が返された後にのみ発生することがあります。 – rpetrich
Mark Besseyとrpetrichのおかげで大変感謝しています。これは今私にとっては明瞭で、私はそれを感謝します。 –