2

次のようなウィンドウを表示するとします。

[[TBAddTaskWindowController new] showWindow:self];

TBAddTaskWindowControllerオブジェクトはどこでリリースされる予定ですか?windowWillCloseで[selfrelease]を呼び出す一般的なソリューションはありますか?

他のオブジェクトがウィンドウを「所有」するのは正しくないと感じます。これは、ユーザーがウィンドウを閉じるまで存在することを意図しているためです。

4

2 に答える 2

5

はい、ウィンドウコントローラを解放する一般的な方法は次のとおりです。

- (void)windowWillClose:(NSNotification *)notification
{
    [self autorelease];
}

ウィンドウコントローラは、ウィンドウが周囲にある間だけ存続する必要があるため、ウィンドウが消えたときに自動リリースすることは完全に理にかなっています。

他のオブザーバーなども削除することを忘れないでください。


[ARCでの作業に関する情報を追加]

ARCの場合、ウィンドウが開いている間はウィンドウコントロールへの強い参照を保持し、ウィンドウが閉じたときにそれを削除する必要があります。
これを行うために、2つの方法で制御されるウィンドウにカテゴリを追加しました。

  • pnl_addWindowController —ウィンドウが最初に開かれたときにウィンドウコントローラーによって呼び出されます
  • pnl_removeWindowController—から呼び出されますwindowWillClose

このカテゴリは、NSMutableSetアクティブなウィンドウコントローラのグローバルを維持します。コードは本質的に公正[gWindowControllers addObject:self]であり[gWindowControllers removeAllObjects]、NSMutableSetの怠惰な作成といくつかのロックがあります。

于 2009-06-23T14:34:48.280 に答える
2

メッセージをクラスに送信することによってウィンドウコントローラをインスタンス化したのと同じコード。これは、メッセージnewによって実行した場合とまったく同じです。allocinit

于 2009-06-23T10:22:26.713 に答える