0

コードのどこかで、メインウィンドウから複数のウィンドウを作成する必要があります。各ウィンドウは特定の構成で機能しますが、すべてのインスタンスは同じコントローラーオブジェクトです。

また、開いているウィンドウのリストを保持する必要があるため、ウィンドウを開くたびにそのインスタンスを辞書に保存し、ウィンドウを閉じるとメインウィンドウに通知を送信して、メソッドを起動し、その特定のウィンドウをから削除します。辞書。

コントローラオブジェクトのインスタンスを作成し、その上で[showWindow:self]を呼び出すことで、ウィンドウを作成します。次に、ウィンドウを辞書に保存して、メソッドを終了します。

私の問題は、ウィンドウがディクショナリから削除されたときに実行する必要があるため、新しく作成されたオブジェクトを解放も自動解放もしないことです(右?)。そのオブジェクトをリリースまたは自動リリースすると、ディクショナリに保存した後、ディクショナリからオブジェクトを削除しようとすると、あらゆる種類のエラーが発生します。

1)これは、インスタンスがディクショナリに格納されていることに気付かないXcodeの単純なバグでしょうか?

2)とにかく、辞書にウィンドウへの参照が保存されている場合、自動解放によってウィンドウが破棄されるのはなぜですか?

[更新]以下のコード

CHPostgreSQLMainController *pgMainController = [[CHPostgreSQLMainController alloc]initWithConnectionSettings:(CHPostgreSQLSettingsModel *)entityFromArray error:&error];

// Only display the window if the connection was successful.
if (pgMainController) {
    [pgMainController showWindow:self];

    // Register the window we've opened on the list of open windows
    [listOpenWindows setObject:pgMainController forKey:[entityFromArray connectionName]];
} else {
    //call NSAlert
}
4

3 に答える 3

1

1) これは、辞書に格納されているインスタンスに気付かない Xcode の単純なバグでしょうか?

いいえ。保持、解放、および自動解放は、それらを実現するためのコードを記述したために発生します。Xcode は、そのような動作をコードに挿入しません。

さて、それは確かに静的アナライザーのバグである可能性があります(ご指摘のとおり)。もっとコードを投稿してください。

2) とにかく、ディクショナリがウィンドウへの参照を保存している場合、自動解放がウィンドウを破棄するのはなぜですか?

保持と解放または自動解放のバランスをとる必要があるような場所にウィンドウを保持しましたか?

そうでない場合は、ウィンドウを解放しすぎています。

静的アナライザー (ビルドと分析) を実行してみて、特定された問題を修正してください。

いずれにせよ、あなたが+allocウィンドウを持っていなかったし、ウィンドウを持っていなかったなら-retain、それを解放すべきではありません。

于 2010-01-07T20:34:12.127 に答える
0

ウィンドウの「閉じたときにリリース」設定がオフになっていることを確認します(またはそれを補正しています)。オンの場合、ユーザーが閉じたときに解放されます。

于 2010-01-07T22:54:52.887 に答える
0

listOpenWindows(実際には が含まOfれている必要があります)が ではないことを確認してくださいnil。作成するのを忘れたか、まだ作成していない可能性があります。

于 2010-01-09T14:01:51.860 に答える