0

私はメモリリークと戦ってきましたが、それはほとんど同じ場所にあるということです。この問題は、ユーザーが食事プランに追加する食品のリストを格納するため、コード全体で必要なグローバル情報を格納するクラスを使用している場合に発生します。私が抱えている問題は、それが私が使用している比較的大きなデータ構造であるということです。データ構造は、他の5つの辞書のキーを備えた辞書であり、すべてに8つの可変配列があり、心臓が望むだけの食物を追加できるため、ユーザーが望むだけ大きくすることができます。

私はそのような構造を設定しました

mealInfo = [[NSMutableDictionary alloc] init]
[mealInfo setObject:[NSMutableDictionary dictionary] forKey:"foo"];
[[mealInfo objectForKey:"such"] setObject: [NSMutableArray array] forKey:"bar"];

これは、完全なデータ構造に対して繰り返されます。これにより、xcodeで分析したときに発生する可能性のあるメモリリークの一部が解決されたようです。問題はさらに進んでいるので、私は問題が解決策ではないという考えを持っています。オブジェクトを作成しました。これにより、現在の.mファイルのローカルスコープにこの構造が作成されます。この構造を、ローカルスコープではなく、mealInfoが作成されるクラスに、そのクラスの静的オブジェクトとともに保存します。(多くの場所に1つあり、2つは行が多すぎるため、あまり多くのコードを使用していません

クラスの静的変数に保存した後、ローカルスコープを解放すると、mealInfoを解放できません。これは、過去にそれを行ったときに、オブジェクトが実際に消えて、作成時に初期化されたクラスでnilになるためです。この情報にアクセスしようとしている他のクラスにはアクセスできません。

私が考えた解決策の1つは、初期化されたクラスですべての保存と保存を行い、ゲッターとセッターだけを使用することでしたが、他のクラスから呼び出すことができるオブジェクトにすることで、より簡単にアクセスできるようにしようとしましたこれらのクラスで変更されたため、少し複雑になり、混乱することがあります。これは避けようとしていました。それが唯一の解決策である場合はそれを行いますが、最初にこのメソッドを機能させたいと思います。

これがあまり混乱しないことを願っています。また、誰かがこのメモリリークの解決策を持っているかもしれないことを願っています。少なくともこのすべてを読むために時間を割いていただきありがとうございます。

4

1 に答える 1

1

質問を理解するのは少し難しいです...しかし、mealInfoそれ自体が静的クラス変数である場合は、次のようにすることで、一度だけ(そして一度だけ)割り当てることができます。

if (!mealInfo)
    mealInfo = [[NSMutableDictionary alloc] init];

そうしないと、割り当てるたびに解放する必要があります。そうしないと、リークが発生します。

于 2012-11-06T02:56:34.110 に答える