我试图弄清楚对象生存期和引用计数与代码块之间是如何相互作用的。在下面的代码中,我只是在做一个简单的动画,当交换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循环中使用此方法时,是否不再需要保留自身(如不使用块的other similar examples中)是否正确?

(2)在这些块执行之前,用这些块调用animateWithDuration:...是否保留定义的视图控制器(自身)?

最佳答案

(1)当使用这种方法的pop + push循环时,是否像其他不使用块的类似示例中那样不再需要保留自身是正确的吗?

它是正确的。如果nextView是局部变量,这些块将自动保留self,navController和nextView。

(2)在这些块执行之前,用这些块调用animateWithDuration:...是否保留定义的视图控制器(自身)?

通过这种方法将这些块从堆栈复制到堆中。这些块在执行后释放。然后从这些块中释放self,navController和nextView。

关于ios - 自身的引用计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5395743/

10-10 08:40