2011-07-06 6 views
1

私はシンプルなナビゲーション階層を持っている:navigationController popToRootViewControllerとviewWillDisappear

Controller 1 > Controller 2 > Controller 3 

各コントローラには、それの子と親への参照(@property (nonatomic, assign) ...)が含まれています。

- (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)が実行される場合があります:

マイviewWillDisappearはこのようなものに見える結果

[self.navigationController popToRootViewControllerAnimated:NO]; 

を、私はので、クラッシュを取得します_refParentViewControllerは(この時点で)割り当て解除されたインスタンスです。 _refParentViewControllerが有効かどうかをどのように確認できますか?私はビューコントローラ/ビューが順番に破壊されると思っていましたが、コントローラ3の前にコントローラ2が破壊されているようです。

私はretainCountを確認できますが、良いアイデア。

答えて

3

私はretainCountを確認できますが、私は の方がいいでしょうか。

ひどい考えです。 retainCountは役に立たず、呼び出さないでください。また、retainCountはとなることはありません。 return 0;オブジェクトが解放されたかどうかを知るために使用することはできません。

親と子の両方のプロパティがassignの場合、View Controllerを保持するのは誰ですか?親/子プロパティの予想寿命にまたがるretainが必要です。

childプロパティをretainに設定し、親プロパティをassignのままにすることをお勧めします。あなたはまた、あなたがnilchildを設定した場合(retain財産とされ、うreleaseそれ限り、あなたは、プロパティのセッターを経るよう)あなたが最初nilに子供のparentプロパティを設定することをことを確認する必要があります。

+0

良い点。提案された解決策が働いた。ありがとう。 – Mustafa

関連する問題