我知道......这个话题还有一个问题。但我真的不明白。
我的代码:
//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/处的最后一个代码块)。
答案 0 :(得分:1)
您确实有一个保留周期,因此请使用完成块中的weakSelf
:
为什么?
块始终保留与它们一起传递的每个对象。
您strong
引用包含保留视图控件的块的pageViewontroller
。
因此,这些对象是相互循环引用的,因此其中一个必须具有弱引用。否则,您的对象将不会被释放。
此外,您不必担心weakSelf
引用,因为:
由于您在viewController
中保留了pageController,因此100%确定当您的completionblock执行时,您的“weakSelf”实例仍然存在。
答案 1 :(得分:0)
完成块强烈提及自我。如果完成块存储在self中,那么您有一个保留周期。大问题。
但是如果没有存储完整块或者其他对象,那么你只是保留自己,但是你没有保留周期。我不知道该块是如何使用的。如果被调用的方法只做了一些事情,调用完成块,然后返回,那么你绝对没问题。
答案 2 :(得分:0)
你的自我被保留用于阻止。但这不是问题。调用后将释放Block,并释放self。
简单规则:如果您在调用后释放阻止 无关心关于块中的保留周期。