【问题标题】:Completion block of an object - retain cycle?对象的完成块 - 保留周期?
【发布时间】:2014-03-14 08:30:38
【问题描述】:

我知道...关于这个主题的另一个问题。但我真的不明白。

我的代码:

//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 正在完成块中被捕获,selfpageViewController 有很强的引用,所以间接我有一个保留周期?

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

或者:即使我有一个保留周期,这有关系吗?当 block 完成时,block 中的所有对象都会被释放,所以保留循环(或对 self 的强引用)也会被释放?

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

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    你确实有一个保留周期,所以请在你的完成块中使用weakSelf

    为什么?

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

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

    您也不应该担心weakSelf 引用,因为: 由于您将 pageController 保留在 viewController 中,因此可以 100% 确定当您的完成块执行时,您的“weakSelf”实例仍然存在。

    【讨论】:

      【解决方案2】:

      完成块有一个对自身的强引用。如果该完成块存储在 self 中,那么您有一个保留周期。大问题。

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

      【讨论】:

        【解决方案3】:

        您的自我被保留以供阻止。但这不是问题。调用后block会被释放,self会被释放。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多