メニュー項目をクリックすると、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 回解放されているかわかりません (または、方法がわからないと言ったほうがよいでしょう)。