(I read your comment to the other question)
After implementing a few more modules using ASIHTTPRequest
, I learned that the best way was to keep a strong
reference to your request object. In your case, you can do:
self.request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:SOME_URL]];
__weak ASIFormDataRequest *weakRequest = self.request; // __block directive not needed since we only access the instance's properties.
[self.request setCompletionBlock:^{
if([weakRequest responseStatusCode] == 200)
// ...
This way you can still control self.request
even after you start the request (e.g. for cancelling). You can do self.request = nil;
when you're ready to release your request, maybe inside your completion block or self.request
's parent object's cleanup methods.
Update:
If you're targeting pre-iOS 5, then the common ground stands: use __unsafe_unretained
instead of __weak
. This is OK because looking at ASIHTTPRequest.m
, the blocks are nil
'ed out in its dealloc()
(i.e. they shouldn't get executed). Although I haven't tested that yet, so make sure to still test with NSZombies enabled.
Note:
The only safe way to cancel an ASIHTTPRequest
object is to call its clearDelegatesAndCancel
method. I've been bitten by some nasty bugs when I was just using the plain cancel
one.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…