PreferencesWindowController

PreferencesWindowController

我正在尝试开发一个简单的应用程序,该应用程序在单击菜单项时会显示一个包含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,因此应该排除所有引用计数问题;但是也许我以一种不好的方式创建了 Controller (需要创建窗口),并且它被错误地释放了。

这是创建并显示窗口的 AppController 的代码:

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

    [preferencesWindow makeKeyAndOrderFront:sender];
}

PreferencesWindowController 中的这段代码实现了dataSource协议(protocol)(由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,它不会崩溃,因此应该有所关联。

哪里错了?

编辑:使用带有僵尸预设的事件探查器(仪器),我可以看到有一个对象的参考计数器变为负数:

但是无论如何,堆栈在我编写的代码之外。我无法在此处放置断点,也看不到哪个对象被释放两次(或者我应该说我不知道​​该怎么做)

最佳答案

preferencesWindow = [[[PreferencesWindowController alloc] initWithWindowNibName:@"PreferencesWindow"] window]行看起来很可疑,因为当您使用强引用引用窗口本身时,看起来就像是让ARC释放了PreferencesWindowController一样。

尝试将PreferencesWindowController对象存储在其自己的strong变量/属性中,并告诉我。

关于objective-c - cocoa , Controller 实例化和崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11820776/

10-09 16:16