iphone - navigationController popToRootViewController 和 viewWillDisappear

标签 iphone objective-c cocoa-touch uinavigationcontroller

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

Controller 1 > Controller 2 > Controller 3

每个 Controller 都包含对其子级和父级的引用(@property(非原子,分配)...)。

我的 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];
}

现在,有一种情况是执行以下语句(由 Controller 1):

[self.navigationController popToRootViewControllerAnimated:NO];

结果,我崩溃了,因为 _refParentViewController 是一个已释放的实例(此时)。如何检查 _refParentViewController 是否有效?我认为 View Controller / View 将按顺序被销毁,但似乎没有任何特定顺序,并且 Controller 2 在 Controller 3 之前被销毁。

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

最佳答案

I can check retainCount but i'm not sure if that's a good idea.

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

如果您的父属性和子属性都是分配,那么谁负责保留 View Controller ?您需要一个能够跨越父/子属性的预期生命周期的retain

我建议您将child属性设为retain并将父属性保留为assign。您还需要确保当您将 child 设置为 nil 时(使用 retain 属性将release 只要您通过属性的 setter),您首先将子级的 parent 属性设置为 nil

关于iphone - navigationController popToRootViewController 和 viewWillDisappear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6596531/

相关文章:

iphone - Storyboard iOS5 - 如何在按下 Segue 按钮时防止 Storyboard 发生变化

iphone - Collection View iOS 7

ios - 将 Nsurl 域名转换为我的国家/地区域名

php - 你能将 php 函数quoted_printable_decode() 转换为基于 NSString 的 Objective-C 函数/类别方法吗?

ios - 制作动画来扩大和缩小 UIView

objective-c - NSManagedObject 键存在于实体描述中,但当尝试访问它时,应用程序崩溃并显示 "this class is not key value coding-compliant"

ios - 您如何判断用户使用的是 iPhone 6 还是 6+

ios - 属性访问结果未使用但 NSLog 工作正常

ios - 防止 initWithContentsOfURL : from using cache

ios - performSegueWithIdentifier 在 iOS 9.x 中导致 NSInternalInconsistencyException 而不是在 8.x 中