我正在使用 UISplitViewController,当加载 Master VC(UITableViewController)并按下表格单元格时,它会创建 Detail VC(带有两个 UIWebViews 的 UIViewController):
@implementation MasterVC
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIViewController *detailViewController = nil;
DetailVC *newDetailViewController = [[DetailVC alloc] initWithNibName:@"DetailVC" bundle:nil];
detailViewController = newDetailViewController;
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = viewControllers;
[viewControllers release];
[detailViewController release];
}
如果我模拟内存警告,将释放 DetailVC(调用了didReceiveMemoryWarning、viewDidUnload、dealloc),但我在 MasterVC 中释放 viewControllers 的行中收到“-[UIView _invalidateSubviewCache]: message sent to deallocated instance”错误,其中有意义,因为它尝试加载由于内存警告而释放的 detailViewController (DetailVC)。为什么它必须发布详细的vc,因为它的视图是正在显示的,我不完全理解。
现在,如果不是在 didSelectRowAtIndexPath 中释放 detailViewController,而是在 viewWillDisappear 中释放它,一切正常:
@implementation MasterVC
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIViewController *detailViewController = nil;
DetailVC *newDetailViewController = [[DetailVC alloc] initWithNibName:@"DetailVC" bundle:nil];
detailViewController = newDetailViewController;
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = viewControllers;
[viewControllers release];
// Released in viewWillDissapear
//[detailViewController release];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
// Retrieve the detail vc and release it-[UIView _invalidateSubviewCache]: message sent to deallocated instance
[[delegate.splitViewController.viewControllers objectAtIndex:1] release];
}
对我来说,当主视图控制器消失时释放细节视图控制器(有些)有意义,但是,它仍然有点像黑客(加上静态分析器抱怨没有在“正确”中释放细节 vc地方)。还有其他更好的方法来解决这个问题吗?