【发布时间】:2012-08-05 22:55:43
【问题描述】:
我正在尝试开发一个简单的应用程序,它在单击菜单项时会显示一个包含 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 的数据源中删除 PreferencesWindowController,它不会崩溃,所以它应该有点相关。
哪里出错了?
编辑:使用带有僵尸预设的分析器(仪器),我可以看到有一个对象的引用计数器变为负数:
但无论如何,堆栈在我编写的代码之外。我不能在那里放断点,我也看不到哪个是被释放两次的对象(或者我应该说我不知道怎么做)
【问题讨论】:
标签: objective-c cocoa crash