NSWindowControllerオブジェクトをリリースする責任は何ですか?
-
06-07-2019 - |
質問
次のようなウィンドウを表示するとします:
[[TBAddTaskWindowController new] showWindow:self];
TBAddTaskWindowControllerオブジェクトはどこでリリースされる予定ですか? windowWillCloseで[自己解放]を呼び出す一般的な解決策はありますか?
他のオブジェクトを「所有」する権利はありません。ウィンドウ。ユーザーが閉じるまで存在するためです。
解決
new
メッセージをクラスに送信してウィンドウコントローラーをインスタンス化した同じコード。 alloc
および initで実行した場合と同じです。
メッセージ。
他のヒント
はい、ウィンドウコントローラーをリリースする一般的な方法は次のとおりです:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
ウィンドウコントローラーは、ウィンドウが周囲にある間のみ存続する必要があるため、ウィンドウが消えたときに自動解放するのは理にかなっています。
他のオブザーバーなども削除することを忘れないでください。
[ARCでの作業に関する情報を追加]
ARCの場合、ウィンドウが開いている間はウィンドウコントロールへの強い参照を保持し、ウィンドウが閉じるときに削除する必要があります。
これを行うために、2つの方法で制御されるウィンドウにカテゴリを追加しました。
-
pnl_addWindowController
—ウィンドウが最初に開かれたときにウィンドウコントローラーによって呼び出されます -
pnl_removeWindowController
—windowWillClose
から呼び出されます
このカテゴリは、アクティブなウィンドウコントローラーのグローバルな NSMutableSet
を維持します。コードは基本的に [gWindowControllers addObject:self]
と [gWindowControllers removeAllObjects]
であり、NSMutableSetの遅延作成とロックが含まれています。
所属していません StackOverflow