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

Ios 对象保留周期的完成块?,ios,objective-c,Ios,Objective C,我知道…这个话题还有一个问题。但我真的不明白 我的代码: //MyViewController.h @property (strong, nonatomic) UIPageViewController *pageViewController; //MyViewController.m - (void)setViewControllerForIndex:(NSInteger)index { [self.pageViewController setViewControllers:_myVi

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

我的代码:

//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
,因此间接地我有一个保留周期

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

或者:即使我有一个保留周期,这是否重要?当块完成时,块中的所有对象都将被释放,因此保留循环(或对自身的强引用)也将被释放


updatedViewControllerTo:
方法也在进行UI更改。因此必须调用该方法。当我使用
weakSelf
时,我是否必须在块中创建
self
的强引用?(参考处的最后一个代码块)

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

为什么?

块始终保留与其一起传递的每个对象。 您正在
strong
引用包含保留viewcontroller的块的
PageViewController

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

另外,您不应该担心
weakSelf
引用,因为:
由于您将pageController保留在您的
视图控制器中,因此当您的completionblock执行时,您的“weakSelf”实例仍处于活动状态将是100%确定的。

完成块强烈引用了self。如果完成块存储在self中,则有一个保留周期。大问题


但如果完成块没有存储在其他对象中,那么您只保留self,但没有保留周期。我不知道那块砖是怎么用的。如果被调用的方法只是做了一些事情,调用完成块并返回,那么您就完全可以了

你的自我将保留在block中。但这不是问题。调用后将释放块,并释放self

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