0

これは本で読みました。

-(IBAction) updateTweets
{
   tweetsView.text = @"";
   [tweetsData release]; 
   tweetsData = [[NSMutableData alloc] init];
   NSURL *url = [NSURL URLWithString:@"http://twitter.com/statuses/public_timeline.xml" ]; 
   NSURLRequest *request = [[NSURLRequest alloc] initWithURL: url]; 
   NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
   [connection release];
   [request release]; 
   [activityIndicator startAnimating];
}

このステートメントでは、その時点で「接続」インスタンスを解放するのは正しいですか? それを解放した後、これは参照カウントが 0 であるため、この NSURLConnection インスタンスが破棄されることを意味します。このインスタンスを解放した後、この接続操作をどのように機能させるのでしょうか? ありがとう。

次のコールバック メソッドのいずれかでリリースする必要があると思いましたよね?

  • connectionDidFinishLoading:

  • 接続:didFailWithError:

4

1 に答える 1

1

initWithRequest を介して接続が送信されたら、実際にはそこで解放しても問題ありません。重要なのは、デリゲートが存在するか、応答が黙って失われることだけです。

私が知る限り、それを解放しない唯一の理由は、デリゲート関数のいずれかのある時点で [connection cancel] を呼び出したい場合です。その場合、提案したことを実行して解放するのが最善ですconnectionDidFinishLoading と didFailWithError の両方が呼び出されるため、そのうちの 1 つだけが呼び出されます (右?)。

編集:より完全な回答については、NSURLConnection initWithRequest は非同期リクエストです。したがって、実際には独自のスレッドを生成します (ただし、initWithRequest を呼び出したスレッドでデリゲート関数を呼び出します)。したがって、基本的に、initWithRequest を呼び出すスレッドでは、実際に接続オブジェクトの処理が完了し、それを解放できます。その間ずっと、あなたが気にする必要のない他のスレッドで何かをしています。

また、そこでリリースする場合は、有効なオブジェクトではないため、finish/fail メソッドでリリースしないように注意してください。

于 2010-05-21T02:12:09.970 に答える