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