【问题标题】:Reference Counting of self in Blocks块中自身的引用计数
【发布时间】:2011-03-22 18:00:14
【问题描述】:

我试图弄清楚对象生命周期和引用计数如何与代码块交互。在下面的代码中,我只是做了一个简单的动画,当 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不使用blocks?

(2) 使用这些块调用 animateWithDuration:... 是否会保留定义的视图控制器(自身)直到块执行?

【问题讨论】:

    标签: ios uiview ios4 core-animation objective-c-blocks


    【解决方案1】:

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

    没错。如果 nextView 是局部变量,这些块会自动保留 self、navController 和 nextView。

    (2) 使用这些块调用 animateWithDuration:... 是否会保留定义的视图控制器(自身)直到块执行?

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

    【讨论】:

    • 所以 'self' 和 navController 被保留,因为它们是从块内部主动引用的,对吗?然而,如果上面的代码没有“navController = self.navigationController”这一行,而是有“navController = mNavigationController”——其中mNavigationController是一个ivar,那么mNavigationController将被保留,而不是“self”。对?我只是想确认块是否自动保留它们的“主机”实例,即“自我”。
    • “self.navigationController”与“[self navigationController]”相同,“mNavigationController”与“self->mNavigationController”相同,因此在这两种情况下都保留了self。如果你想避免保留self,使用局部变量作为“UINavigationController *controller = self.navigationController;”,然后在blocks中使用“controller”。
    • 评论已编辑:我现在明白了!谢谢。
    • 我做了ATSDragToReorderTableViewController *blockSelf = self; 并使用了本地blockSelf,但不知何故self 仍然被保留而不被释放(当我弹出它时没有调用self 的dealloc)。我做错了什么???
    • 嗯,我建议你用你的代码 sn-p 创建一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多