Зачем выпускать экземпляр NSURLConnection в этом утверждении? - PullRequest
0 голосов
/ 21 мая 2010

Я прочитал это в книге.

-(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];
}

Правильно ли в этом утверждении освобождать экземпляр «соединения» в это время? После его освобождения это означает, что этот экземпляр NSURLConnection будет уничтожен, поскольку его счетчик ссылок равен 0, как мы собираемся заставить эту операцию соединения работать после выпуска этого экземпляра? БЛАГОДАРНОСТЬ.

Я подумал, что мы должны выпустить его одним из следующих методов обратного вызова, верно?

  • connectionDidFinishLoading:

  • подключение: didFailWithError:

1 Ответ

1 голос
/ 21 мая 2010

На самом деле нормально выпускать его там, как только соединение отправлено через initWithRequest, единственное, что имеет значение, это то, что делегат существует, или я верю, что ответ будет просто потерян.

Из того, что яМожно сказать, что единственная причина не выпускать его есть, если вы хотите вызвать [соединение отменено] в какой-то момент в одной из функций делегата, и в этом случае было бы лучше сделать то, что вы предлагаете, и выпустить это в ОБАМ соединении connectionDidFinishLoading иdidFailWithError, поскольку будет вызываться только один из них (верно?).

Редактировать: для более подробного ответа NSURLConnection initWithRequest является асинхронным запросом.Таким образом, он на самом деле порождает свой собственный поток (но вызывает функции делегата в потоке, который вызвал initWithRequest).Таким образом, в основном, в потоке, который вызывает initWithRequest, вы фактически сделали с объектом подключения и можете его освободить.Все это время он делает что-то в другом потоке, и вам не нужно об этом беспокоиться.

Кроме того, я должен отметить, что если вы все-таки выпустите его, убедитесь, что вы НЕ выпускаете его в конце/ fail, потому что это не будет действительный объект.

...