2014-03-14 471 views
2

我知道...這個話題還有一個問題。但我真的不明白。對象的完成塊 - 保留週期?

我的代碼:

//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嗎?

或者:即使我有保留週期,它有什麼關係嗎?當塊完成時,塊中的所有對象將被釋放,因此保留週期(或對自身的強引用)也將被釋放?

方法updatedViewControllerTo:也在做UI更改。所以這個方法必須被調用。當我使用weakSelf時,是否必須在塊中創建self的強引用? (參考http://masteringios.com/blog/2014/03/06/avoid-strong-reference-cycles/的最後一個代碼塊)。

回答

1

你有一個保留週期,所以請在你完成塊的使用weakSelf

爲什麼?

塊總是保留與它們一起傳遞的每個對象。 你是strong引用pageViewontroller,其中包含保留您的視圖控制器的塊。

因此,這些對象是循環引用海誓山盟,所以他們之一必須有一個弱引用。否則,你的對象將不會被釋放。

而且你不應該擔心weakSelf參考,因爲: 因爲你是保留的PageController在viewController,這將是一定的100%,當你的completionblock被執行,你的「weakSelf」實例還活着。

0

完成塊有很強的自我意識。如果該完成塊存儲在自身中,則您有一個保留週期。大問題。

但是,如果該完成塊沒有儲存或存儲在某個其他對象中,那麼您只需保留自我,但您沒有保留週期。我不知道如何使用該塊。如果被調用的方法只是做一些事情,調用完成塊並返回,那麼你是絕對好的。

0

你自己保留塊。但這不是問題。在調用之後,塊將被釋放並且自我將被釋放。

規則很簡單:如果你釋放塊調用後您不關心關於保留週期塊。