对象的完成块 - 保留周期?

时间:2014-03-14 08:30:38

标签: ios objective-c

我知道......这个话题还有一个问题。但我真的不明白。

我的代码:

//MyViewController.h
@property (strong, nonatomic) UIPageViewController *pageViewController;

//MyViewController.m
- (void)setViewControllerForIndex:(NSInteger)index {
    [self.pageViewController setViewControllers:_myViewControllers[index]
                                      direction:UIPageViewControllerNavigationDirectionForward
                                       animated:animated
                                     completion:^(BOOL finished){

                                            [self updatedViewControllerTo:index]; //this method is doing a lot of stuff

                                     }];
}

我现在有保留周期吗? self在完成模块中被捕获,self强烈引用了pageViewController,因此间接地我有一个保留周期?

我是否必须使用__weak MyViewController *weakSelf语句并在完成块中使用weakSelf

或者:即使我有保留周期也很重要吗?当块完成时,块中的所有对象都将被释放,因此保留周期(或对self的强引用)也将被释放?

方法updatedViewControllerTo:也在进行UI更改。所以必须调用该方法。当我使用weakSelf时,我是否必须在块中创建self的强引用? (参考http://masteringios.com/blog/2014/03/06/avoid-strong-reference-cycles/处的最后一个代码块)。

3 个答案:

答案 0 :(得分:1)

您确实有一个保留周期,因此请使用完成块中的weakSelf

为什么?

块始终保留与它们一起传递的每个对象。 您strong引用包含保留视图控件的块的pageViewontroller

因此,这些对象是相互循环引用的,因此其中一个必须具有弱引用。否则,您的对象将不会被释放。

此外,您不必担心weakSelf引用,因为: 由于您在viewController中保留了pageController,因此100%确定当您的completionblock执行时,您的“weakSelf”实例仍然存在。

答案 1 :(得分:0)

完成块强烈提及自我。如果完成块存储在self中,那么您有一个保留周期。大问题。

但是如果没有存储完整块或者其他对象,那么你只是保留自己,但是你没有保留周期。我不知道该块是如何使用的。如果被调用的方法只做了一些事情,调用完成块,然后返回,那么你绝对没问题。

答案 2 :(得分:0)

你的自我被保留用于阻止。但这不是问题。调用后将释放Block,并释放self。

简单规则:如果您在调用后释放阻止 无关心关于块中的保留周期。