UISplitViewController - 处理内存警告

时间:2010-08-04 12:13:48

标签: iphone ipad memory-management memory-leaks uisplitviewcontroller

我正在使用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被调用)但是我得到了一个“ - [UIView _invalidateSubviewCache]:发送到解除分配实例的消息”错误在MasterVC的行中我发布了viewControllers,因为它试图加载由于内存警告而释放的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) '正确的地点)。还有其他更好的解决方法吗?

0 个答案:

没有答案