4

これは変です。NSTableViewを学習するための非常に単純なプロジェクトがあり、それは私のペン先に設定され、ビューベースのtableViewとして設定されています。また、dataSourceを設定し、コントローラーオブジェクトに委任しました。

ただし、これを実行して実行すると、EXC_BAD_ACCESSが取得され、トレースはメイン関数で開始され、スタックの残りの部分はCocoaの内部にあります(コードではありません)。

このプロジェクトがARCを使用していることを除いて、実際には何も特別なことは行われていません(これは新しいプロジェクトであるため、これがデフォルトでした)。

また、Analyzerを使用して、どこでもメモリ管理が不適切に行われておらず、問題がないことを確認しました。

dataSource / delegateを設定しなくてもクラッシュは発生しませんが、明らかにこれはアプリを構築するための非常に良い方法ではありません。

何か案は?

編集

デリゲートとdataSourceは両方ともIBで設定されます。コードは次のとおりです(ビューベース)。注意することが重要です。このコードが存在するかどうかに関係なくクラッシュが発生します。どちらの場合も同じクラッシュです。

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return 5;
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSTextField *cell = [tableView makeViewWithIdentifier:@"MyView" owner:self];

    if (nil == cell) {
        cell = [[NSTextField alloc] initWithFrame:CGRectZero];


        cell.identifier = @"MyView";
    }


    [cell setStringValue:[NSString stringWithFormat:@"Row %d", row + 1]];

    return cell;
}
4

1 に答える 1

5

簡単だ!

私は(やや意図的に)変数をリークしようとしていましたが(インスタンス変数を作成するのが面倒だったため...ここにクイックコードを記述しました)、もちろんARCがそのリークを処理してくれたため、すべてが失敗しました上。

そのため、プロパティを作成するだけで、strong固定しようとしたオブジェクト(tableViewのデリゲートおよびdataSourceとして機能していたオブジェクト)が途中で解放されないようにする必要がありました。

于 2011-08-14T17:29:05.750 に答える