EXC_BAB_ACCESSを使用しないでこの変数を解放する方法は?どのようにこのメモリリーク(iPhone)を解決するには?
UIImage *Moins1;
...
@property (nonatomic, retain) UIImage *Moins1;
EXC_BAB_ACCESSを使用しないでこの変数を解放する方法は?どのようにこのメモリリーク(iPhone)を解決するには?
UIImage *Moins1;
...
@property (nonatomic, retain) UIImage *Moins1;
問題は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];
あなたはNSDataオブジェクトに-copy
を送信する必要はありません。 UIImage
は、周囲のデータへの参照を保持せず、単にそれを読み込んでイメージを生成します。 -release
を付けずに-copy
を送信すると、メモリリークが発生します。
ただし、EXC_BAD_ACCESS
については説明しません。あなたが投稿したコードからではなく、何かが続いています。
コードには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]];
-(void)dealloc
{
if(self.Moins1!=nil)
{
self.Moins1 = nil;
}
}
countはすでに1であり、uを割り当てるとcountが2になるので、deallocが呼び出されたときにnilかどうかをチェックし、nilでnilにならないかどうかをチェックします。このように変数の保持カウントを0に設定します
コードブロックを投稿するだけでなく、このコードが問題を解決する理由を説明してください。説明がなければ、これは答えではありません。 –
あなたの答えにそれを編集してください。 –
Obj-Cの規約を守るべき理由がない限り、変数には小文字の最初の文字が必要です。 'ImageAvatar'は本当に 'imageAvatar'、 'Moins1'は 'moins1'でなければなりません。 –