我有一个简单的导航层次结构:

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,但是我不确定这是个好主意。

最佳答案

我可以检查retainCount,但我不是
  确定这是个好主意。


这是一个可怕的想法。 keepCount是无用的,请不要调用它。请注意,retainCount永远不会返回0;它不能用于知道对象是否已释放。

如果您的父级和子级属性均为assign,那么谁负责保留视图控制器?您需要一个跨越父/子属性的预期寿命的retain

我建议您将child属性设置为retain,并将父属性保留为assign。您还需要确保在将child设置为nil时(只要具有属性retain,只要您通过属性的设置器,它就会release),您首先要设置孩子的属性设置为parent

10-07 20:51