次のようなウィンドウを表示するとします。
[[TBAddTaskWindowController new] showWindow:self];
TBAddTaskWindowControllerオブジェクトはどこでリリースされる予定ですか?windowWillCloseで[selfrelease]を呼び出す一般的なソリューションはありますか?
他のオブジェクトがウィンドウを「所有」するのは正しくないと感じます。これは、ユーザーがウィンドウを閉じるまで存在することを意図しているためです。
次のようなウィンドウを表示するとします。
[[TBAddTaskWindowController new] showWindow:self];
TBAddTaskWindowControllerオブジェクトはどこでリリースされる予定ですか?windowWillCloseで[selfrelease]を呼び出す一般的なソリューションはありますか?
他のオブジェクトがウィンドウを「所有」するのは正しくないと感じます。これは、ユーザーがウィンドウを閉じるまで存在することを意図しているためです。
はい、ウィンドウコントローラを解放する一般的な方法は次のとおりです。
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
ウィンドウコントローラは、ウィンドウが周囲にある間だけ存続する必要があるため、ウィンドウが消えたときに自動リリースすることは完全に理にかなっています。
他のオブザーバーなども削除することを忘れないでください。
ARCの場合、ウィンドウが開いている間はウィンドウコントロールへの強い参照を保持し、ウィンドウが閉じたときにそれを削除する必要があります。
これを行うために、2つの方法で制御されるウィンドウにカテゴリを追加しました。
pnl_addWindowController
—ウィンドウが最初に開かれたときにウィンドウコントローラーによって呼び出されますpnl_removeWindowController
—から呼び出されますwindowWillClose
このカテゴリは、NSMutableSet
アクティブなウィンドウコントローラのグローバルを維持します。コードは本質的に公正[gWindowControllers addObject:self]
であり[gWindowControllers removeAllObjects]
、NSMutableSetの怠惰な作成といくつかのロックがあります。
メッセージをクラスに送信することによってウィンドウコントローラをインスタンス化したのと同じコード。これは、メッセージnew
によって実行した場合とまったく同じです。alloc
init