2012-02-17 11 views
0

保持変数&としてインスタンス変数を宣言してから、2回リリースしました。私はそれを解放した後、私はそれを使用していません。これはクラッシュすることはありません。 (変数がリリース後に使用する予定がないことを考えると)必要以上の変数を放出し、他の影響はあります:保持カウント以上の変数を解放することの影響

@property (nonatomic, retain) NSString *myVariable; 
self.myVariable = nil; 
self.myVariable = nil; 
+1

オブジェクトと変数の違いについては混乱しているようです。変数がnilの場合、変数は無限に解放されます。無期限でないオブジェクトを1度だけ解放すると、クラッシュが発生します。 – hotpaw2

+0

あなたは正しいと思います。私はそれを受け入れることができるようにこれを答えとして入れることができますか? – Abhinav

答えて

1

変数とオブジェクトの違いについて混乱するかもしれません。 1つの変数を無限回のリリースで使用することができます(たとえば、nilの場合、またはリリースごとに完全に異なる保持されたオブジェクトを保持する場合など)。これは、変数がオブジェクトを保持できないか、回。)。あなたの例では、変数は2番目のリリース中にオブジェクトを保持しません(nil)。

しかし、いずれか1つの非nilオブジェクトを1回だけ解放すると、クラッシュする可能性があります。

4

あなたは二回、それを解放する、実際には、ありません。これは、プロパティを使用しているためです。最初にself.myVariable = nilに電話をしたら、それを解放します(値があると仮定して)。しかし、2度目のは既に0であるので、はリリースされません。

一般に、実際にオブジェクトを複数回リリースする(または正確には、リリースよりもリリースを長くする)ことは本当に悪く、アプリをクラッシュさせることになります。

2

実際には2度リリースしていません。セッターは、次のようになりますことを考える:

- (void)setMyVariable:(NSString)value 
{ 
    [myVariable release]; 
    myVariable = [value retain]; 
} 

最初self.myVariable = nilmyVariable IVARをリリースする予定、ともゼロに設定します。 [nil release]は何もしないので、次のself.myVariable = nilは何もしません。

実際にオブジェクトのオーバーリレースは(通常は)クラッシュを引き起こします。

0

コードに何も起こりません。私はARC(自動参照カウント)を使用しているので、ポインタをnilに設定することで "解放"していると仮定します。

実際にどのように動作するかは、メモリにNSStringオブジェクトが割り当てられていると仮定して作成し、それにポインタを割り当てます。

これでポインタがそのオブジェクトを指していますが、どの弧がそうですか:オブジェクトがポインタを指していない場合は、自動的に解放されます。そのNSString上に "myvariable"ポインタしかないと仮定すると、それをnilに設定した瞬間に解放されます。

myvariableを再びnilに設定すると、以前にオブジェクトがリリースされて以来、何もしていないことになります。

これは、そのNSStringを指す別の変数があると、オブジェクトWONTは解放されますが、myvariableはそれ以上指し示されないことに注意してください。

忘れてしまったことは、レイ・ウェンデリッヒの「iOS 5チュートリアル」の弧の仕組みについての優れた説明があります。

PD:あなたはARCを使用している場合、uはあなたの

@property(アトミック、保持)NSStringの* myVariable変数を変更する必要があります。

@property(非アトミック、強い)NSStringの* myVariable変数に

0

iOS 5の新しいARC(Automatic Reference Counting)では、コンパイラがこれを処理するため、この問題については心配する必要はありません。

は、ここではそれについては、こちらをご覧ください: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

しかし、あなたは/ ARCを使用しないことができない場合は、ここに私の代替の答えは次のとおりです。

あなたにアクセスすることにより、あなたが道をvarsの(self.var = nil)、私の推測では、これらの合成された関数は非保持varを解放しないように扱うので、何度も好きなようにするのは安全です(非常にエレガントではありません)。

一方、この[var release]のようなリリースを明示的に呼び出すと、かなり厄介な問題が発生する可能性があります。

関連する問題