Search code examples
macoscocoamemory-leaksnstableviewnsviewcontroller

NSViewController view's not released when used in a view based NSTableView


I have a view based NSTableView that uses the views of NSViewController subclasses (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;
}

All is ok except that the view of NSViewController is never released when I remove the view controller (which is well released).

If I use this code instead :

- (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;
}

The view is correctly released when I remove the view controller. Here is the code for removing a view controller :

- (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];
}

I tried to reproduce the problem with a small sample code and I have the same problem, the view of view controller is only released when I don't return directly the view of view controller.

Anybody can help me please ?


Solution

  • Found, NSTableView retains view for reusing, it is correctly released with this code :

    - (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;
    }