2011-07-06 32 views
1

我有一個簡單的導航層次:navigationController popToRootViewController和viewWillDisappear

Controller 1 > Controller 2 > Controller 3 

每個控制器都包含一個參考(@property (nonatomic, assign) ...)給它的孩子和家長。

我viewWillDisappear看起來是這樣的:

- (void)viewWillDisappear:(BOOL)animated { 
    NSLog(@"%s", __FUNCTION__); 

    if (![self.navigationController.viewControllers containsObject:self]) { 
     // View has been popped! Important to distinguish between view popping and tab switching. 
     // If parent view controller is active, pass a message. 
     if (_refParentViewController && !_isSearchViewController) { 
      _refParentViewController.valueX = @"xyz"; 
     } 
    } 

    [super viewWillDisappear:animated]; 
} 

現在,有在那裏執行以下語句(由控制器1)的情況下:

[self.navigationController popToRootViewControllerAnimated:NO]; 

其結果是,我得到一個崩潰,因爲_refParentViewController是一個解除分配的實例(在這一點上)。我如何檢查_refParentViewController是否有效?我認爲視圖控制器/視圖將按順序銷燬,但似乎沒有任何特定的順序,並且控制器2在控制器3之前被銷燬。

我可以檢查retainCount,但我不確定這是否是好主意。

回答

3

我可以檢查retainCount,但我不是 當然,如果這是一個好主意。

這是一個可怕的想法; retainCount是無用的,不要叫它。並注意retainCount可以從不返回0;它不能用於知道對象是否被釋放。

如果您的父母和子女的財產都是assign,那麼誰負責保留視圖控制器?您需要一個retain,它跨越父/子屬性的預期使用壽命。

我建議你製作child屬性retain並將父屬性保留爲assign。您還需要確保當您設置childnil(其中,具有retain屬性將release只要你去通過屬性的setter),您首先孩子的parent屬性設置爲nil

+0

好點。建議的解決方案奏效謝謝。 – Mustafa

相關問題