2010-05-21 3 views
0

Я прочитал это в книге.Зачем освобождать экземпляр NSURLConnection в этом заявлении?

-(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

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

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

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

Также следует отметить, что если вы его отпустите, убедитесь, что вы НЕ отпустите его в методах финиша/отказа, потому что это не будет действительный объект.

+0

Это похоже на NSAlertView? Сначала вы создаете экземпляр NSAlertView, покажите его, а затем немедленно отпустите его, но на экране все еще есть alertView, он все еще работает, не так ли? Но это все еще заставляет меня смутить, ПОЧЕМУ мы можем управлять объектом, который был отчужден в теории? –

+0

Я подозреваю, что объект сохраняется в другом потоке. Когда вы отпускаете его, у другого потока все еще есть удержание, поэтому оно не уничтожается. Но, поскольку вы опубликовали свою ссылку в своем потоке, использование этой ссылки неверно. Если вы сделали Obj * o = [[Obj alloc] init]; Obj * p = [o сохранить]; [p release]; [p someMethod]; Объект по-прежнему существует (сохранен o), но вы освободили p, уменьшив количество удержаний, но когда вы вызываете [p someMethod]; Я думаю, что это приведет к сбою, даже если объект используется для обозначения того, что на самом деле существует. Не уверен, но и не на моем Mac, чтобы проверить! – Tom

Смежные вопросы