我试图了解对象生存期和引用计数如何与代码块交互。在下面的代码中,我只是做一个简单的动画,当UINavigationController的堆栈顶视图被交换时闪烁。棘手的部分是弹出的视图控制器是定义此代码的那个。
[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;}];
}];
我的问题是(忽略动画的样子),这是从内存管理角度来看这是正确的方法。特别是:
(1)当使用这种方法进行pop + push循环时,是否正确不再需要保留self,如other similar examples中不使用块的那样?
(2)使用这些块调用animateWithDuration:...是否保留定义视图控制器(self),直到块执行?
答案 0 :(得分:5)
(1)当使用这种方法时,pop + push循环是否正确,不再需要保留self,就像其他不使用块的类似示例一样?
这是对的。如果nextView是局部变量,这些块会自动保留self,navController和nextView。
(2)使用这些块调用animateWithDuration:...是否保留定义视图控制器(self),直到块执行?
通过此方法将这些块从堆栈复制到堆中。这些块在执行后被释放。然后是self,navController和nextView从这些块中释放出来。