2

メニュー項目をクリックすると、NSTableView を含むウィンドウが表示される単純なアプリケーションを開発しようとしています。問題は、NSTableView がデータを表示した直後にアプリがクラッシュすることです。完全なスタック トレース:

* thread #1: tid = 0x2107, 0x00007fff943bce90 libobjc.A.dylib\`objc_msgSend + 16,
             stop reason = EXC_BAD_ACCESS (code=13, address=0x0)
  frame #0: 0x00007fff943bce90 libobjc.A.dylib`objc_msgSend + 16

私は ARC を使用しているので、参照カウントの問題を除外する必要があります。しかし、おそらく私はコントローラー(ウィンドウを作成するために必要な)を悪い方法で作成しており、誤って解放されています。

これは、ウィンドウを作成して表示するAppControllerのコードです。

- (IBAction)showPreferences:(id)sender {
    if(!preferencesWindow) {
        preferencesWindow = [[[PreferencesWindowController alloc]
                          initWithWindowNibName:@"PreferencesWindow"] window];
    }

    [preferencesWindow makeKeyAndOrderFront:sender];
}

PreferencesWindowControllerのこのコードは、dataSource プロトコル (NSTableView で必要) を実装します。

- (int)numberOfRowsInTableView:(NSTableView *)tabView {
    return 1;
}

- (id)tableView:(NSTableView *)tabView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row {
    NSString *val = [NSString stringWithFormat:@"%@[%d]", [tableColumn identifier], row];
    return val;
}

それ自体がクラッシュを引き起こしているわけではありません。しかし、NSTableView の dataSource から PreferencesWindowController を削除すると、クラッシュしないので、多少関係があるはずです。

間違いはどこですか?

編集: ゾンビ プリセットでプロファイラー (Instruments) を使用すると、参照カウンターが負になるオブジェクトがあることがわかります。

楽器のスクリーンショット

とにかく、スタックは私が書いたコードの外にあります。そこにブレークポイントを設定することはできません。また、どのオブジェクトが 2 回解放されているかわかりません (または、方法がわからないと言ったほうがよいでしょう)。

4

1 に答える 1

1

preferencesWindow = [[[PreferencesWindowController alloc] initWithWindowNibName:@"PreferencesWindow"] window]強力な参照でウィンドウ自体を参照しているときに、ARCにを解放させているように見えるため、この行は疑わしいように見えますPreferencesWindowController

PreferencesWindowControllerオブジェクトを独自のstrong変数/プロパティに保存してみて、私に知らせてください。

于 2012-08-05T23:31:08.853 に答える