0

[これはまったくおかしなことではないと思いますが、少しだけ助けが必要です]

私は2つのretainプロパティを持っています

@property (nonatomic, retain) NSArray *listContent;
@property (nonatomic, retain) NSArray *filteredListContent;

メソッドではviewDidLoad、2 番目の値を最初の値と等しく設定します (つまり、retainCount は 2 になっていると思います)。

self.filteredListContent = self.listContent;

そして、すべての検索でこれを行います

 self.filteredListContent  = [listContent filteredArrayUsingPredicate:predicate];

この割り当てのすぐ上で実行する必要があると思いreleaseました-プロパティは余分な保持を引き起こすはずなので、そうですか? - しかし、これにより、検索メソッドを 2 回目に実行したときにプログラムが爆発します。保持カウント (追加なしrelease) は、最初に検索メソッドに入ったときは 2 で、その後は毎回 1 です (残念ながら、これは私が予想していたものです)。

いくつかのガイダンスが役立ちます、ありがとう!リリースしないのは正しいですか?

4

3 に答える 3

3

リリースする必要はありません、それは正しいです。

変数は 2 つの場所に格納されているため、保持カウントは 2 である必要があります。クラッシュする理由は次のとおりです。(括弧内に self.listContent の数を保持します。)

self.listContent = someArray [1]
self.filteredListContent = self.listContent [2]
[self.filteredListContent リリース] [1]

self.filteredListContent = somethingElse [0] -> listContent の割り当て解除
[self.listContent doSomething] [おっと、悪いことが起こる]

self.listContent割り当て解除が早すぎます。使用しない場合は[... release]、保持カウントの計算が機能します。

どのような場合にreleaseを使用するかについての非常に短い要約については、Vincent Gable のブログをお読みください。(興味深いことに、このブログ投稿は、Stackoverflow に関する Andiih の回答に触発されました。)

于 2010-05-25T20:03:19.133 に答える
2

retainいいえ、フィルター検索を実行する前に電話をかける必要はありません。プロパティの古い値は解放されます。

初めて保持カウントを確認し、同じ配列オブジェクトを参照し、両方がその配列の参照カウンターを持っていますself.filteredListContentself.listContent検索self.listContentの保持カウントが 1 に低下した後self.filteredListContent、検索結果が設定された時点で解放された (その後保持された) ためです。

于 2010-05-25T20:03:05.053 に答える
2

オブジェクトを NARC* していない場合は、その必要はありませんrelease

*NARC -- 新規、割り当て、保持、コピー

保持されたプロパティはretain、割り当て時の新しい値でありrelease、それが発生したときの古い値でもあります。

于 2010-05-25T20:03:52.853 に答える