我有一个简单的导航层次结构:
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/