2

我有一个基于视图的 NSTableView,它使用 NSViewController 子类 (InspectorViewController) 的视图:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    // Get inspector view controller
    InspectorViewController *inspectorViewController = [_inspectorViewControllers objectAtIndex:row];

    // Return its view
    return inspectorViewController.view;
}

一切都很好,只是当我删除视图控制器(已很好地释放)时,NSViewController 的视图永远不会释放。

如果我改用此代码:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    // Get inspector view controller
    InspectorViewController *inspectorViewController = [_inspectorViewControllers objectAtIndex:row];

    // Return its view
    NSTableCellView *view = [[NSTableCellView alloc] init] autorelease];
    [view addSubview:inspectorViewController.view];
    return view;
}

当我删除视图控制器时,视图被正确释放。这是删除视图控制器的代码:

- (void)inspectorViewControllerClosed:(InspectorViewController *)inspectorViewController {
    // Get index of inspector view controller
    NSUInteger index = [_inspectorViewControllers indexOfObject:inspectorViewController];

    // Remove inspector view controller in array
    [_inspectorViewControllers removeObject:inspectorViewController];

    // Create index set
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:index];

    // Begin updates
    [_tableView beginUpdates];

    // Move row in table view
    [_tableView removeRowsAtIndexes:indexSet withAnimation:NSTableViewAnimationEffectFade];

    // End updates
    [_tableView endUpdates];
}

我试图用一个小的示例代码重现这个问题,我有同样的问题,只有当我不直接返回视图控制器的视图时,视图控制器的视图才会被释放。

任何人都可以帮助我吗?

4

2 回答 2

1

发现, NSTableView 保留视图以供重用,使用以下代码正确发布:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    // Get inspector view controller
    InspectorViewController *inspectorViewController = [_inspectorViewControllers objectAtIndex:row];

    // Disable reusing ?
    [_inspectorViewController.view setIdentifier:nil];

    // Return its view
    return inspectorViewController.view;
}
于 2013-02-23T18:29:57.430 回答
0

你可以使用:

[inspectorViewController.view removeFromSuperview]

在删除视图控制器之前。

于 2013-02-23T17:32:15.720 回答