2009-07-31 36 views
0

如何在没有EXC_BAB_ACCESS的情况下释放此变量?如何解决这个内存泄漏(iPhone)?

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

Moins1是接口的会员专区声明如下:

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

除非你有很好的理由打破Obj-C约定,否则变量应该有一个小写的第一个字母 - 'ImageAvatar'应该是'imageAvatar','Moins1'应该是'moins1'。 – 2010-03-14 05:37:25

回答

2

看起来问题不是UIImage的,而是NSData的。在Cocoa中,任何复制(或mutableCopy)方法都会返回一个带有+1保留计数的对象,这意味着您拥有它并因此负责释放它。

在你的代码中,你正在调用-copy myg.imageData,但从来没有释放它。这是内存泄漏的典型例子。这里是我会做什么来解决它,再加上改变你的语法有点:

伊娃:

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

你不应该需要发送-copy到NSData对象。 UIImage不保留对数据的引用,只是读取它并生成图像。发送-copy而没有-release是内存泄漏。

但是,这并不能解释EXC_BAD_ACCESS。还有其他事情正在发生,而不是您发布的代码。

0

你的代码有两个问题。如其他贡献者所指示的imageData的复制,以及赋予Moins1字段而不保留该对象。

Moins1直接访问该字段,所以你需要做你自己的保留。如果您不保留它并在下一行中释放它,则对该字段的任何子序列访问都会导致保护错误。

可以使用属性赋值:

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

或者你也可以做它在同一行:

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

看到,当你给和对象一个保留属性的计数已经是1,当你分配它时,它的计数变成2,所以当dealloc被调用时,它将检查它是否为零,如果它不为零,这样它将使变量的保留计数为0

+0

而不是只发布一段代码,请*解释*为什么这段代码解决了问题。没有解释,这不是一个答案。 – 2012-10-10 09:11:44