我正在使用 Bindings 为 Photoshop CS3 插件开发 Cocoa 用户界面。(Cocoa 中的 Carbon,因为 PS 是 Carbon 应用程序)EXC_BAD_ACCESS
当我关闭我的模态NSWindow
和NSAutoreleasePool
发布时出现错误。
我相信它与我在 nib 文件中的绑定和控制视图有关,因为当我从 nib 的复选框和单选按钮中删除绑定时,窗口可以无限次关闭而不会崩溃。
我现在已经花了几个小时在 Instruments 上试图找出哪个对象可能会提前释放(或双重释放)并且找不到它。
NSAutoreleasePool
现在我的想法是,在一段时间内使用 Cocoa Bindings运行模式窗口时,我可能会遗漏一些东西。就像在关闭窗口以“完成”所有绑定以防止它们将消息发送到已释放对象之前我应该做的事情一样。
这是我正在做的一个基本代码示例:
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 个)
关闭所有绑定可以消除任何崩溃。
有任何想法吗?