navigationController popToRootViewController和viewWillDisappear

时间:2011-07-06 12:41:49

标签: iphone objective-c cocoa-touch uinavigationcontroller

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

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是否有效?我认为视图控制器/视图将按顺序被销毁,但看起来没有任何特定的命令,Controller 2在Controller 3之前被销毁。

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

1 个答案:

答案 0 :(得分:3)

  

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

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

如果您的父级和子级属性都是assign,那么谁负责保留视图控制器?您需要retain跨越父/子属性的预期生命周期。

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