【发布时间】:2009-11-06 19:47:11
【问题描述】:
我正在使用 Bindings 为 Photoshop CS3 插件开发 Cocoa 用户界面。 (Cocoa 中的 Carbon,因为 PS 是 Carbon 应用程序)当我关闭我的模态 NSWindow 和 NSAutoreleasePool 版本时,我收到了一个 EXC_BAD_ACCESS 错误。
我相信这与我在 nib 文件中的绑定和控制视图有关,因为当我从 nib 的复选框和单选按钮中删除绑定时,窗口可以无限次关闭并且不会崩溃。
我现在已经花了几个小时在 Instruments 上试图找出哪个对象可能会提前释放(或双重释放)并且找不到它。
现在我的想法是,在使用 Cocoa Bindings 时,在 NSAutoreleasePool 中运行模式窗口可能缺少一些东西。比如在关闭窗口之前我应该做一些事情来“完成”所有绑定,以防止它们向释放的对象发送消息。
这是我正在做的基本代码示例:
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
NSApplicationLoad();
ExportWindowController *controller = [[ExportWindowController alloc] initWithWindowNibName:EXPORT_CONTROLLER_NIB_NAME];
[controller showWindow:nil];
[NSApp runModalForWindow:[controller window]];
[controller close];
[controller release];
[localPool release];
模态窗口通过调用关闭:
[NSApp stopModal];
这是一个堆栈跟踪:
#0 0x97793869 in _cache_getMethod
#1 0x9779c6da in lookUpMethod
#2 0x97793da7 in _class_lookupMethodAndLoadCache
#3 0x97793953 in objc_msgSend
#4 0x96501151 in -[NSBinder releaseConnectionWithSynchronizePeerBinders:]
#5 0x96a10390 in -[NSValueBinder releaseConnectionWithSynchronizePeerBinders:]
#6 0x963ac895 in -[NSObject(_NSBindingAdaptorAccess) _releaseBindingAdaptor]
#7 0x964062f5 in -[NSView _releaseBindingAdaptor]
#8 0x96405784 in -[NSView _finalizeWithReferenceCounting]
#9 0x96404e2f in -[NSView dealloc]
#10 0x964ef163 in -[NSControl dealloc]
#11 0x9099a9d8 in CFRelease
#12 0x909c75bd in _CFAutoreleasePoolPop
.... more
打开 NSZombieEnabled 并没有出现任何双重释放的对象(尽管 Photoshop 本身有 1 个)
关闭所有绑定可以避免任何崩溃。
有什么想法吗?
【问题讨论】:
-
你可能想要
[localPool drain],而不是[localPool release]。 -
感谢您的提示。但是,它并没有摆脱崩溃者。
-
如果 removeObserver... 有效,请告诉我。
-
感谢 Lyndsey 一直关注这一点——我真的很感激。我尝试添加一个 removeObserver : [[NSNotificationCenter defaultCenter] removeObserver:windowController] 但我仍然遇到了崩溃。
-
目前的解决方案是关闭绑定并使用普通连接+操作。
标签: objective-c cocoa photoshop cocoa-bindings macos-carbon