2009-07-31 30 views
0

EXC_BAB_ACCESSを使用しないでこの変数を解放する方法は?どのようにこのメモリリーク(iPhone)を解決するには?

UIImage *Moins1; 
... 
@property (nonatomic, retain) UIImage   *Moins1; 
+0

Obj-Cの規約を守るべき理由がない限り、変数には小文字の最初の文字が必要です。 'ImageAvatar'は本当に 'imageAvatar'、 'Moins1'は 'moins1'でなければなりません。 –

答えて

2

問題はUIImageではなく、NSDataのではないように見えます:

//First line create memory leak 
UIImage *ImageAvatar = [[UIImage alloc] initWithData:[myg.imageData copy]]; 
Moins1 = ImageAvatar; 
//[ImageAvatar release]; if i release-> EXC_BAD_ACCESS 

Moins1は、インターフェイスのmenberはこのように宣言されています。 Cocoaでは、コピー(またはmutableCopy)メソッドは+1保持カウントを持つオブジェクトを返します。つまり、オブジェクトを所有しているため、オブジェクトを解放する必要があります。

あなたのコードでは、myg.imageDataで-copyを呼び出していますが、それを解放することはありません。これは、メモリリークの典型的な例です。ここで私はあなたの構文ビットを変更すると、プラス、それを修正するためにどうなるのかです:

IVAR:

UIImage *Moins1; 
@property (nonatomic, retain) UIImage *Moins1; 

実装:

NSData * imageData = [myg.imageData copy]; 
UIImage * ImageAvatar = [[UIImage alloc] initWithData:imageData]; 
[imageData release]; 
[self setMoins1:ImageAvatar]; 
[ImageAvatar release]; 
0

あなたはNSDataオブジェクトに-copyを送信する必要はありません。 UIImageは、周囲のデータへの参照を保持せず、単にそれを読み込んでイメージを生成します。 -releaseを付けずに-copyを送信すると、メモリリークが発生します。

ただし、EXC_BAD_ACCESSについては説明しません。あなたが投稿したコードからではなく、何かが続いています。

0

コードには2つの問題があります。 imageDataのコピーは、他のコントリビュータに示されており、オブジェクトを保持せずにMoins1フィールドに割り当てられています。

Moins1へのアサインメントはフィールドに直接アクセスするので、自分で行う必要があります。それを保持せずに次の行で解放すると、フィールドへのサブシーケンスアクセスによって保護エラーが発生します。

あなたが割り当てにプロパティを使用することができます。

UIImage *ImageAvatar = 
    [[UIImage alloc] initWithData:[[myg.imageData copy] autorelease]]; 
self.Moins1 = ImageAvatar; 
[ImageAvatar release]; 

それとも、また、ちょうど1行でそれを行うことができますuはその保持性を付与し、オブジェクトのときに表示

self.Moins1 = [UIImage imageWithData:[[myg.imageData copy] autorelease]]; 
0
-(void)dealloc 
    { 
    if(self.Moins1!=nil) 
    { 
     self.Moins1 = nil; 
    } 
    } 

countはすでに1であり、uを割り当てるとcountが2になるので、deallocが呼び出されたときにnilかどうかをチェックし、nilでnilにならないかどうかをチェックします。このように変数の保持カウントを0に設定します

+0

コードブロックを投稿するだけでなく、このコードが問題を解決する理由を説明してください。説明がなければ、これは答えではありません。 –

+0

あなたの答えにそれを編集してください。 –

関連する問題