我有一个简单的导航层次结构:
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
,但我不确定这是不是一个好主意。
答案 0 :(得分:3)
我可以查看retainCount,但我不是 确定这是个好主意。
这是一个可怕的想法; retainCount没用,不要调用它。请注意,retainCount 永远不会返回0;它不能用于知道对象是否被释放。
如果您的父级和子级属性都是assign
,那么谁负责保留视图控制器?您需要retain
跨越父/子属性的预期生命周期。
我建议您创建child
属性retain
并将父属性保留为assign
。您还需要确保在将child
设置为nil
时(retain
具有release
属性parent
,只要您通过属性的setter )您首先将孩子的nil
属性设置为{{1}}。