Search code examples
iosuiviewios4core-animationobjective-c-blocks

Reference Counting of self in Blocks


I'm trying to get my head around how object lifetime and reference counting interact with code blocks. In the following code I'm just doing a simple animation that flashes as the top view on a UINavigationController's stack is swapped. The tricky part is that the popped view controller is the one where this code is defined.

[UIView animateWithDuration:0.2 
        animations:^{self.navigationController.view.alpha = 0.0;}
        completion:^(BOOL finished){ 
                UINavigationController *navController = self.navigationController;  

                [self.navigationController popViewControllerAnimated:NO]; 
                [navController pushViewController:nextView animated:NO];
                [nextView release];

                [UIView animateWithDuration:0.2 
                        animations:^{navController.view.alpha = 1.0;}];                    
                 }];    

My question is (ignoring what the animation looks like), is this the correct way to do this from a memory management perspective. In particular:

(1) When using this approach for the pop+push cycle, is it correct that it is no longer necessary to retain self, as in other similar examples that do not use blocks?

(2) Does invoking animateWithDuration:... with the these blocks retain the defining view controller (self) until the blocks execute?


Solution

  • (1) When using this approach the the pop+push cycle, is it correct that it is no longer necessary to retain self, as in other similar examples that do not use blocks?

    It is correct. These blocks automatically retain self, navController and nextView if nextView is local variable.

    (2) Does invoking animateWithDuration:... with the these blocks retain the defining view controller (self) until the blocks execute?

    These blocks are copied to heap from stack by this method. And these blocks are released after execution. And then self, navController and nextView are released from these blocks.