2011-08-12 6 views
2

私のアプリではHTTPコールを行う必要があり、Webサービスからの応答結果には興味がありません。だから私は接続を作成し、それを起動し、メモリリークを引き起こさないようにautoreleaseすることは問題ではないかと思っていた。NSURLConnection start + autorelease

NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:nil]; 
[connection start]; 
[connection autorelease]; 

HTTP呼び出しが行われる前にガベージコレクションによって接続オブジェクトが破壊される可能性はありますか?

答えて

3

これは良い質問です。 NSURLConnectionがオペレーティングシステムによって保持されていることが明示されていなくても、接続要求が実行ループのソースとして追加され、そのまま保持されることは明らかです。 いずれにしても、接続の終了を

connectionDidFinishLoading:
で観測し、その後に接続オブジェクトを解放した後で、この部分で説明したように、要求の最小デリゲートを設定する方がよいでしょう。

最後に、if接続が要求のダウンロードに成功すると、デリゲートはconnectionDidFinishLoading:メッセージを受信します。代理人は接続のためのそれ以上のメッセージを受信せず、NSURLConnectionオブジェクトを解放することができます。

connection:didFailWithError:
というエラーのため、同じ理由で接続の終了を観察する必要があります。

+0

通常のワークフローでは、応答が取得された後に接続が解放される必要があることはわかっています。代表団とのテストは、確かではありません。否定的な結果だけが確定的になります。オートレリースされた接続でいくつかの肯定的な回答が得られたとしても、そうすることはOKであるとは限りません。 –

+0

viggio、それはすばらしい答えです! – Akshay

+0

Akshay:ありがとう テオドール:これはポイントです、代理人のアプローチは安全です、代理人を使用して予期しない結果につながる可能性があります。 – viggio24

1

サーバーからの応答は必要ありません。しかし、接続が確立されていることを確認したいのですか?接続がタイムアウトするとどうなりますか?クライアントはエラーについても知りません。要求がサーバーに届いたことを確認した後で、接続インスタンスを解放する方が良いと感じています。

startImmediatelyパラメータにinitWithRequest:delegate:startImmediately:メソッドを使用しないため、startを呼び出す必要はありません。