Bindingsを使用してPhotoshopCS3プラグイン用のCocoaユーザーインターフェイスを開発しています。(PSはCarbonアプリであるため、Cocoaの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つありましたが)
すべてのバインディングをオフにすると、クラッシュがなくなります。
何か案は?