【发布时间】:2011-09-06 01:26:22
【问题描述】:
目前我正在学习使用 Cocoa 进行 Mac 开发的 Obj-C。我用检查器制作了一个简单的文件浏览器,以查看文件的图标和一些信息。到目前为止,一切都很好。现在我让它基于文档,所以我可以打开多个窗口。
为了告诉检查员应该检查哪个文件,我使用NSWindowDidBecomeMainNotification。在窗口之间切换效果很好,但是当我关闭所有窗口然后打开一个新窗口时它会给出EXC_BAD_ACCESS。
这是处理通知的方法:
- (void)windowChanged: (NSNotification *)notification
{
NSWindow *window = [notification object];
BrowserWindow *doc = [[window windowController] document];
if (currentDocument != doc) {
[currentDocument.arrayController removeObserver: self
forKeyPath: @"selectionIndex"];
[icon setImage:nil];
[size setStringValue:@"-"];
[owner setStringValue:@"-"];
[filename setStringValue:@"(none selected)"];
[doc.arrayController addObserver: self
forKeyPath: @"selectionIndex"
options: NSKeyValueObservingOptionNew
context: NULL];
currentDocument = doc;
}
}
错误发生在它在currentDocument.arrayController 上调用removeObserver:forkeyPath:。这有点道理,它试图移除不再存在的东西的观察者,因为窗口是关闭的。但是如何解决呢?我就是想不出别的了。。
有人能给我指出正确的方向吗?
感谢您的帮助! :)
--
它变得越来越奇怪了。刚刚检查了可从我所拥有的书的网站下载的示例,他们使用相同的方法,但一切正常。找不到任何差异,这让我发疯。
--
解决了!稍后再详细说明。
【问题讨论】:
-
这是哪个类的方法?
-
你
retaincurrentDocument 在哪里? (我猜不是。) -
@Rudy Velthuis 这是
InspectorController的方法。 -
@Daniel R Hicks:我没有
retain它。我刚刚在removeObserver之前放置了一个NSLog和一个retainCount,就在它出错之前,它显示了这个:2011-09-05 00:43:06.015 FileBrowser1[17664:707] Cannot remove an observer <InspectorController 0x10014b730> for the key path "selectionIndex" from <NSView 0x10049a1e0> because it is not registered as an observer. -
上面的消息包含 NSLog,它是空的。不是 0 什么的,什么都没有。在它只显示数值之前。
标签: objective-c cocoa