2012-01-17 12 views
0

私は属性として(nonatomic, assign)を持っています。割り当てられたインスタンス変数プロパティの保持

ある方法では、私はreleasingその行の後に変数retainingです。

スタティックアナライザは、incorrect decrement of the reference count of object...という警告を出しています。

保持し、両方が同じ方法で起こる放し、あなたはローカル変数にプロパティをコピーして、それに仕事をしたいかもしれないので、私はこの

@property (nonatomic, assign) Class *iVar; 

      [self.iVar retain]; 
      [self.iVar removeFromSuperview]; 
      [self insertSubview:self.iVar atIndex:self.iVar.index]; 
      [self.iVar release]; 
+1

正確に何をしているのかのコード例を投稿してください。 – Joe

+0

私はコードを追加しました。 – Jon

答えて

2

を行うことはできません。

UIView *someView = self.interestingView; 
[someView retain]; 
//...do some stuff... 
[someView release]; 

少なくともいくつかの部分がself.interestingViewを変更する場合に備えて、何らかの保護を提供します。そしてそれはおそらくスタティックアナライザを満足させるでしょう。

一般に、-deallocのようないくつかの明確な状況を除いて、これらのプロパティのアクセサー外のプロパティを保持/解放しないようにします。同様に、[self.foo retain]のように、プロパティアクセスの結果を直接保持または解放しないでください。リリースに入る前にそのプロパティが変更された場合は、リークとそれ以降のリリースの両方で終了します。

+0

いい回答です。 temp変数は、起こっていることをはるかに明確にします。プロパティへのアクセスの結果に 'release'を送ることは、通常、悪い考えです。 IOWは、アクセサメソッド内のivarメモリ(および 'init' /' dealloc')のみを管理します。 –

+0

@JoshCaswell私は同意し、それを追加します。プロパティを使用してメモリを管理するか、自分で実行しますが、両方ではありません。 – Caleb

0

私はちょうどあなたが財産表記

[iVar retain]; 
[self.iVar removeFromSuperview]; 
[self insertSubview:self.iVar atIndex:self.iVar.index]; 
[iVar release]; 

それとも一時的な変数を使用することができますを使用しないことにより、静的アナライザをなだめるなり、

を同様の例をテストしました。

1

問題は、変数で作業していないことです。あなたはプロパティアクセサーの結果に取り組んでいます。プロパティにアクセスするたびに、スタティックアナライザはメソッドから返されたオブジェクトの通常のメモリ管理ルールを適用します。つまり、解放しないでください。実際のローカル変数またはインスタンス変数を使用するように変更すると、警告は消えてしまいます。

関連する問題