私は見た後にさらに明確化を求めていますWhat is responsible for releasing NSWindowController objects?誰がNSWindowControllerを所有していますか?
私は甥のための簡単な在庫管理アプリケーションを書いています。私は、 "ライブラリ"の内容を表示するテーブルビューを持っています。新しいアイテムをライブラリに追加するには、 '+'ボタンをクリックします。このボタンは、項目の詳細を促す新しいウィンドウを開き、「OK」をクリックすると入力を検証します。
すべてはうまくいきます。しかし、私はメモリ管理についての質問があります。他に何もeditorController
を参照していないので、私は、addNewItem:
の終わりにリリース(も自動解放)editorController
することはできません
- (IBAction)addNewItem:(id)sender {
LibraryItemEditorController *editorController =
[[LibraryItemEditorController alloc]
initWithWindowNibName:@"LibraryItemEditor"];
[editorController showWindow:nil];
// editorController is "leaked" here, it seems.
}
;:新しいウィンドウを作成するために、私は次のコードを使用しますもし私がそれをリリースすると、ウィンドウはすぐに消えます。しかし、ウィンドウが閉じられるとウィンドウコントローラーが解放されるようにします。 AppleのWindow Programming Guideでは、私は次をお読みください。
あなたは に窓の開閉が、それは 文書の一部でない場合、両方のウィンドウとウィンドウコントローラ が離れて行く
NSWindowController
のサブクラスを作りたい場合 として、ウィンドウのデリゲートをNSWindowWillCloseNotification
を観察したりすることができ、windowWillClose:
メソッドを実装し、あなたの 実装でコードの 次の行を含める:[self autorelease];
私は、ウィンドウコントローラのwindowWillClose:
メソッドで[self autorelease]
を使用しました。これは動作し、メモリをリークしません。しかし、それはちょうど醜い感じです。 addNewItem:
はメモリがリークしているように見えますが、静的解析でもそう考えています。 私はが実際にはwindowDidClose:
の世話をしていることを知っていますが、それは間違っていると感じます。さらに、ウィンドウコントローラは今までそれ自体を保持することなくそれ自体を解放している。これはすべて、私が学んだメモリ管理ルールに反するものです。
私の他のオプションは、親コントローラ上IVARを置く(NSWindowController
またはNSWindowController
秒のNSMutableSet
のいずれか)と、親コントローラにNSWindowWillCloseNotification
を監視し、それに応答して、それを解放することです。これはよりクリーンで、おそらく私がやることです。それはまた、かなりの量の仕事ですが、私の質問につながります。
NSWindowDidCloseNotification
これを行う標準的な方法を見ていますか?オンデマンドで作成および破棄される標準的な方法はNSWindowControllers
ですか? [self autorelease]
は伝統的に推奨されているオプションですか?これが問題になるという静的分析が行われたのは今のところですか?
私はモーダルウィンドウとして実行していませんでしたが、おそらく私はそうすべきだと思います。共有インスタンスのバージョンはインスペクタパネルには意味があると思います。同時に、複数のウィンドウを同時に開く必要がある場合は、それらを直接把持することはおそらく意味があります。これは私のために働く。 –
クラスのメソッドはインスタンス変数にアクセスできないため、この答えは正しいとは思いません。この場合、クラスメソッド "sharedInstance"が "_sharedInstance"というiVarにアクセスしようとしています。これは毎回失敗します。 – Bryan
'_sharedInstance'は静的変数であり、ivarではありません。それは一般に共有インスタンスがどのように実装されるかです。 –