0

Bindingsを使用してPhotoshopCS3プラグイン用のCocoaユーザーインターフェイスを開発しています。(PSはCarbonアプリであるため、CocoaのCarbon)EXC_BAD_ACCESSモーダルNSWindowNSAutoreleasePoolリリースを閉じるとエラーが発生します。

チェックボックスからバインディングを削除し、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つありましたが)

すべてのバインディングをオフにすると、クラッシュがなくなります。

何か案は?

4

2 に答える 2

3

スタッククロールが示すように、バインディングが問題を引き起こしているように見えるのは正しいです。しかし、それは単なる症状であり、問​​題ではないと思います。

ご存知のように、CarbonアプリケーションのCocoaは扱いにくい場合があります。

あなたが書くとき、「ExportWindowController runModalWindowForExportはこれです:」私はこれらの点を理解していますか?

  1. ExportWindowControllerはNSWindowControllerに基づくクラスですか?
  2. もしそうなら、いつウィンドウを閉じますか?[self close]が表示されますが、NSWindowControllerに関連付けられた「close」セレクターが表示されません。電話する必要があります:

    [[controller window] performClose:[NSApplication sharedApplication]];
    

?3.また、NSAppはインスタンス化されていますか?窓が見えますか?時々正しく動作させるために[NSApplicationsharedApplication]を使用する必要がありました...。

これのいずれかが役立つかどうか私に知らせてください。

編集:2009年11月6日:16:15 EST: Cocoaバインディングが1つしかない場合はどうなりますか?バインディングが最初にバインドされているデータを解放していますか?もしそうなら、おそらくあなたはそうすべきではありません...

編集:2009年11月9日:16:27 EST:私は最近、Carbonアプリケーションで動作するプラグインで作業していました。このプラグインは、Cocoaをベースとして使用しています。NSTrackingAreasをNSControlsに追加するまで、すべてが見事に進んでいました。その後、プラグインのNSAutoreleaseプールが空になっているときに、あらゆる種類のクラッシュが発生し始めました。各NSControlのremoveTrackingArea関数を呼び出すことで、この問題を解決しました。

おそらく、NSWindowControllerベースのオブジェクトに対して同様のことを行う必要がありますか?Deallocセレクターで、バインドしている各オブジェクトのremoveObserver:forKeyPathをコードで呼び出してみてください。

于 2009-11-06T20:31:54.197 に答える
1

NSAutoreleasePool が排出されているときにクラッシュする場合は、何かが過剰に解放されていることが原因です。ゾンビ検出をオンにして、何を把握できるはずです。オーバーリリースされているオブジェクトのタイプを見つけます。

完全な推測で、-deallocメソッドを に実装しExportWindowControllerますか? もしそうなら、ロード時に発生しなかっ-releaseた NIB ロードによって作成されたオブジェクトを ing していますか?-retain

于 2009-11-07T02:26:53.940 に答える