In ARC, it is assumed that a block causes a save loop if you use self inside a block, for example.
I saw a workaround here , for example: 
How does this workaround prevent a save cycle?
weakRequest is just a pointer to the same object that request refers to. When ARC changes the persistence value of weakRequest or request , it affects the same object.
Then in the block this strange thing happens:
__strong ASIHTTPRequest *strongRequest = weakRequest;
It means that:
ASIHTTPRequest *strongRequest = weakRequest; [strongRequest retain];
But again: this is one and the same object. Why are all these different variable names? They are just pointers!
I never cared about blocks or tried to avoid them. But now it made me admire what everyone is talking about when they say that "the block captures the variables." Until today, I thought that this means that the block will save every pointer that you use that was defined outside the scope of the block, which means that the block just saves any object that you touch in its area.
I did this quick test:
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; [self.view addSubview:v]; v.backgroundColor = [UIColor orangeColor]; NSLog(@"self = %p", self);
As you can see, the object itself remains the same. The block does not create a copy. Therefore, I can safely assume that all years of knowledge of C and Objective-C remain valid:
ASIHTTPRequest *strongRequest = internetRequest; ASIHTTPRequest *foo = strongRequest; ASIHTTPRequest *bar = foo; if (bar == internetRequest) { NSLog(@"exact same thing, of course"); }
So what's going on there? How to resolve the save account, if all this happens, creates different pointers to the same object? Why an extra mile of creating these pointers?
Won't it be exactly the same thing?
[request setCompletionBlock:^{ NSString *respondeString = [request responseString]; if ([_delegate respondsToSelector:@selector(pingSuccessful:)]) { [_delegate pingSuccessful:responseString]; } }];
There must be some secret in Objective-C that explains why duplicate pointers solve memory management problems here. It just doesn't make any sense to me.