Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 块中自组织的参考计数_Ios_Uiview_Ios4_Core Animation_Objective C Blocks - Fatal编程技术网

Ios 块中自组织的参考计数

Ios 块中自组织的参考计数,ios,uiview,ios4,core-animation,objective-c-blocks,Ios,Uiview,Ios4,Core Animation,Objective C Blocks,我试图弄清楚对象生存期和引用计数是如何与代码块交互的。在下面的代码中,我只是做了一个简单的动画,在交换UINavigationController堆栈的顶视图时闪烁。棘手的部分是弹出的视图控制器就是定义此代码的控制器 我的问题是(忽略动画的外观),从内存管理的角度来看,这是正确的方法吗。特别是: (1) 在pop+推送循环中使用此方法时,是否不再需要保留自我,如不使用块 (2) 正在调用animateWithDuration:。。。在这些块执行之前,是否保留定义视图控制器(self) (1) 在

我试图弄清楚对象生存期和引用计数是如何与代码块交互的。在下面的代码中,我只是做了一个简单的动画,在交换UINavigationController堆栈的顶视图时闪烁。棘手的部分是弹出的视图控制器就是定义此代码的控制器

我的问题是(忽略动画的外观),从内存管理的角度来看,这是正确的方法吗。特别是:

(1) 在pop+推送循环中使用此方法时,是否不再需要保留自我,如不使用块

(2) 正在调用animateWithDuration:。。。在这些块执行之前,是否保留定义视图控制器(self)

(1) 在pop+push循环中使用此方法时,是否不再需要像其他不使用块的类似示例中那样保留self

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

(2) 正在调用animateWithDuration:。。。在这些块执行之前,是否保留定义视图控制器(self)


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

因此保留“self”和navController,因为它们是从块内部主动引用的,对吗?但是,如果上面的代码没有行“navController=self.navigationController”,而是有“navController=mNavigationController”-其中mNavigationController是ivar,那么mNavigationController将被保留,而不是“self”。对吗?我只想确认块是否自动保留其“主机”实例,即“self”。“self.navigationController”与“[self-navigationController]”相同,“mNavigationController”与“self->mNavigationController”相同,因此在这两种情况下都保留self。如果要避免保留self,请使用局部变量“UINavigationController*controller=self.navigationController;”,然后在块中使用“controller”。注释编辑:我现在就知道了!谢谢。我做了
ATSDragToReorderTableViewController*blockSelf=self
并使用了本地blockSelf,但不知何故self仍然被保留而没有被释放(当我弹出self时,self的dealloc没有被调用)。我做错了什么???嗯,我建议你用你的代码片段创建一个问题。
[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;}];                    
                 }];