現在の状況は次のとおりです。dictKeyArrayという名前のNSMutableArrayがあり、これを使用してプロパティを割り当て@property(nonatomic,retain)NSMutableArray *dictKeyArray
、実装ファイルで可変配列を合成します。
後で、辞書名storeDictがあります。次のように、ディクショナリのすべてのキーをdictKeyArrayに割り当て
dictKeyArray = [[storeDict allKeys] mutableCopy];
ます。これで、このディクショナリを後で実装ファイルで使用します。しかし、それをリリースすることになると、私はそれを私のdealloc
メソッドで一度リリースします。計器で確認すると漏れが出ます!dictKeyArrayがリークしているのはなぜですか?assign
代わりに使用する必要がありretain
ますか?違いが正確に何であるかはまだわかりません...ありがとうございます!
2 に答える
を使用する必要がありますself.dictKeyArray = ...
。を使用しないとself.
、インスタンス変数に直接アクセスし、プロパティのメモリ管理の利点をバイパスしますが、 の結果をmutableCopy
所有していることに注意してください。所有権も取得するプロパティに割り当てると、二重所有権が発生するため、次を使用します。
self.dictKeyArray = [[[storeDict allKeys] mutableCopy] autorelease];
あなたはそれを送信する必要があります
[[[storeDict allKeys] mutableCopy] autorelease];
これを明確にするために、問題のオブジェクトの所有権を主張していることを意味するmutableCopy
のと同じことを行います。alloc
keepCount を 1 減らす必要があります。
ちなみに、あなたが書いたアクセサを使うべきです。現時点では、それを iVar に割り当てています。アクセサーを機能させたい場合は、次のようなものを使用する必要があります
object.dictKeyArray = ...;
一般に。またはここ(dreamlaxで言及されているように)
self.dictKeyArray = ...;
コードが含まれているこの特定のクラスのオブジェクトを参照しているためです。
この方法でのみ、オブジェクトがアクセサーによって適切に保持されるようになります。それ以外の場合、アクセサー コードを記述してもまったく意味がありません。呼び出されることはないからです。
注: Josh がコメントで述べたように、コードは有効である必要があります (少なくとも私の観点からは)。私が提案したのは、ルールを順守しているため、あなたほどエラーが発生しにくいソリューションです (近い将来、頭痛の種から解放される可能性があります)。