0

現在の状況は次のとおりです。dictKeyArrayという名前のNSMutableArrayがあり、これを使用してプロパティを割り当て@property(nonatomic,retain)NSMutableArray *dictKeyArray
、実装ファイルで可変配列を合成します。
後で、辞書名storeDictがあります。次のように、ディクショナリのすべてのキーをdictKeyArrayに割り当て
dictKeyArray = [[storeDict allKeys] mutableCopy];
ます。これで、このディクショナリを後で実装ファイルで使用します。しかし、それをリリースすることになると、私はそれを私のdeallocメソッドで一度リリースします。計器で確認すると漏れが出ます!dictKeyArrayがリークしているのはなぜですか?assign代わりに使用する必要がありretainますか?違いが正確に何であるかはまだわかりません...ありがとうございます!

4

2 に答える 2

1

を使用する必要がありますself.dictKeyArray = ...。を使用しないとself.、インスタンス変数に直接アクセスし、プロパティのメモリ管理の利点をバイパスしますが、 の結果をmutableCopy所有していることに注意してください。所有権も取得するプロパティに割り当てると、二重所有権が発生するため、次を使用します。

self.dictKeyArray = [[[storeDict allKeys] mutableCopy] autorelease];
于 2012-06-13T18:50:36.253 に答える
1

あなたはそれを送信する必要があります

[[[storeDict allKeys] mutableCopy] autorelease];

これを明確にするために、問題のオブジェクトの所有権を主張していることを意味するmutableCopyのと同じことを行います。allockeepCount を 1 減らす必要があります。

ちなみに、あなたが書いたアクセサを使うべきです。現時点では、それを iVar に割り当てています。アクセサーを機能させたい場合は、次のようなものを使用する必要があります

object.dictKeyArray = ...;

一般に。またはここ(dreamlaxで言及されているように)

self.dictKeyArray = ...;

コードが含まれているこの特定のクラスのオブジェクトを参照しているためです。

この方法でのみ、オブジェクトがアクセサーによって適切に保持されるようになります。それ以外の場合、アクセサー コードを記述してもまったく意味がありません。呼び出されることはないからです。

注: Josh がコメントで述べたように、コードは有効である必要があります (少なくとも私の観点からは)。私が提案したのは、ルールを順守しているため、あなたほどエラーが発生しにくいソリューションです (近い将来、頭痛の種から解放される可能性があります)。

于 2012-06-13T18:49:54.897 に答える