1

OK、ここに私が直面している奇妙な状況があります:

  • NSWindowControllerサブクラスがあり、ウィンドウがありmyMainWindow.xib、次AppDelegate.mのように呼び出していNSWindowControllerます:

    myWindowController* controller = [[myWindowController alloc] initWithWindowNibName:@"myMainWindow"];
    [controller showWindow:self];
    

今ここに何があります:

  • ARC が に設定されているNO場合、アプリは正常に動作し、ウィンドウも正常に表示されます。
  • ARCを設定するとYES-設定した直後(そして1回だけ実行)-一連のエラーが表示されます:

2 月 17 日 16:35:45 DrKameleons-iMac.local MyApp[16903]: kCGErrorIllegalArgument: _CGSFindSharedWindow: WID 2409 2 月 17 日 16:35:45 DrKameleons-iMac.local MyApp[16903]: kCGErrorFailure: ブレークポイント @ CGErrorBreakpoint() をログに記録されたときにエラーをキャッチします。2 月 17 日 16:35:45 DrKameleons-iMac.local MyApp[16903]: kCGErrorIllegalArgument: CGSOrderFrontConditionally: 無効なウィンドウ

そして、ウィンドウは表示されませ

アプリを再実行しようとしても (何も変更せずに、ARC はオンのままです)、ウィンドウはまだ表示されません。しかし、エラーはまったくありません。:S

何が起こっている?これを修正する方法 (およびウィンドウを表示する方法) に関するアイデアはありますか?


ヒント :

  • Mac OS X 10.7.5 で実行
  • Xcode バージョン: 4.5.1
4

1 に答える 1

5

ARC がオンの場合、LOCAL コントローラーは showWindow 呼び出しの直後に解放されます。しかし、ウィンドウが延期されているため、ウィンドウはまだ存在していません-そして、そうであったとしても、「コントローラーレス」
になり、ウィンドウはコントローラーを保持しません:)その逆のみ

修正は、コントローラーへの参照を記憶することです appDelegate が割り当て解除されるまで/終了するまで

@implementation AppDelegate {
    myWindowController* _controller;
}

...
_controller = [[myWindowController alloc] initWithWindowNibName:@"myMainWindow"];
[_controller showWindow:self];

コントローラーのリリースが発生せず、リークするだけなので、コードはアークなしで機能します! ただし、ARCはリリースコールを追加します(コントローラーが使用されなくなったことを正しく認識しているため)

于 2013-02-17T15:16:37.673 に答える