最近、Apple SDK (iPhone など用) を学習していて、理解できないことに遭遇しました。http://developer.apple.com/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.htmlの「NSURLConnection の使用」のドキュメント
奇妙な説明とサンプル コードを見つけました。まず、次のように述べています。
ダウンロードは、initWithRequest:delegate: メッセージを受信するとすぐに開始されます。デリゲートが connectionDidFinishLoading: または connection:didFailWithError: メッセージを受信する前に、接続にキャンセル メッセージを送信することにより、いつでもキャンセルできます。
次に、次のコードを示します。
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if (theConnection) { // 保持する NSMutableData を作成します // 受信データ // receivedData は別の場所でメソッド インスタンスとして宣言されています receivedData=[[NSMutableData データ] 保持]; } そうしないと { // ダウンロードできなかったことをユーザーに通知します }
そのため、接続が初期化されるとすぐに、別のスレッドでダウンロードをすぐに開始する必要があるように思えます。これは明らかです。なぜなら、このコードは非ブロッキングであり、メッセージをデリゲート (この場合は self) に送り返すからです。それでも、(autorelease スタイルの) receivedData の割り当ては、他のスレッドが開始された後に発生します。これは危険な競合状態ではありませんか? これは、サーバーの応答が非常に高速な場合 (ループバック デバイスなど)、または不運なスレッド スケジューリングの場合に、クラッシュ、メモリ リーク、またはデータの損失を引き起こす可能性はありませんか? theConnection が初期化される前に receivedData を割り当ててから、上記の else の場合にそれを解放する方が理にかなっているでしょうか?
私はこのコードにとても混乱しています。誰かが私のためにいくつかの光を当ててくれることを願っています. 情報をありがとう、
ルディ・チリブラシ