簡體   English   中英

對象的完成塊-保留周期?

[英]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被捕獲在完成塊中,並且selfpageViewController有很強的引用,因此間接地我有一個保留周期?

我是否必須使用__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM