views:

125

answers:

1

I read this in a book.

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

In this statement,is that correct to release the "connection" instance at that time? After releasing it which means this NSURLConnection instance will be destroyed since it's reference count is 0 ,how are we going to make this connection operation work after release this instance? THANKS.

I thought we should release it in one of the following callback methods,right?

  • connectionDidFinishLoading:

  • connection:didFailWithError:

+1  A: 

It's actually fine to release it there, once the connection is sent out via initWithRequest, the only thing that matters is that the delegate exists or I believe the response will just be silently lost.

From what I can tell, the only reason to not release it there is if you want to call [connection cancel] at some point in one of the delegate functions, in which case it would be best to do what you suggest and release it in BOTH connectionDidFinishLoading and didFailWithError since only one of them will be called (right?).

Edit: For a more thorough answer, NSURLConnection initWithRequest is an asynchronous request. So it actually spawns it's own thread (but calls the delegate functions on the thread that called initWithRequest). So basically, on the thread that calls initWithRequest you are actually done with the connection object and you can release it. All the while it's doing stuff on some other thread that you don't need to be concerned with.

Also I should note that if you do release it there, make sure you DON'T release it in the finish/fail methods, because it won't be a valid object.

Tom
Is that similar to NSAlertView? You first instantiate a NSAlertView instance ,show it ,and then release it immediately,but you still got an alertView on the screen,it is still operational,right?But it still make me confused,WHY can we operate an object which has been detroyed in theory?
aquaibm
I suspect the object is being retained on another thread. When you release it, the other thread still has a retain on it, so it isn't destroyed. But, since you released your reference on your thread, using that reference is not valid. If you did Obj* o = [[Obj alloc] init]; Obj* p = [o retain]; [p release]; [p someMethod]; The object is still there (retained by o) but you released p, decrementing the retain count, but when you call [p someMethod]; I think that will cause a crash even tho the object is used to refer to still actually exists. Not sure, but also not on my mac to test!
Tom