[英]Completion block of an object - retain cycle?
我知道...對此主題還有另一個問題。 但是我真的不明白。
我的代碼:
//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/上的最后一個代碼塊)。
您確實有保留周期,因此請在完成代碼塊中使用weakSelf
:
為什么?
塊始終保留與它們一起傳遞的每個對象。 您strong
引用pageViewontroller
,該pageViewontroller
包含一個保留了ViewController的塊。
因此,這些對象是相互循環引用的,因此其中之一必須具有弱引用。 否則,您的對象將不會被釋放。
另外,您也不必擔心weakSelf
引用,因為:由於您將pageController保留在viewController
,因此可以100%確定當您完成completeblock時,“ weakSelf”實例仍然有效。
完成模塊對自我有強烈的參考。 如果該完成程序塊自身存儲起來,那么您將有一個保留周期。 大問題。
但是,如果未將完成塊存儲在其他對象中,那么您只是保留了自己,而沒有保留周期。 我不知道該塊是如何使用的。 如果被調用的方法只是做一些事情,調用完成塊並返回,那么您絕對可以。
您的自我將被保留。 但這不是問題。 調用后將釋放塊,並釋放自身。
一個簡單的規則:如果在調用后釋放塊 , 則不必關心在塊中保留循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.