2

NSViewControllerサブクラス(InspectorViewController)のビューを使用するビューベースのNSTableViewがあります。

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

小さなサンプルコードで問題を再現しようとしましたが、同じ問題が発生しました。ViewControllerのビューは、ViewControllerのビューを直接返さない場合にのみ解放されます。

誰かが私を助けてくれますか?

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 に答える