如何在没有EXC_BAB_ACCESS的情况下发布此变量?
//First line create memory leak
UIImage *ImageAvatar = [[UIImage alloc] initWithData:[myg.imageData copy]];
Moins1 = ImageAvatar;
//[ImageAvatar release]; if i release-> EXC_BAD_ACCESS
Moins1是接口的manber,声明如下:
UIImage *Moins1;
...
@property (nonatomic, retain) UIImage *Moins1;
答案 0 :(得分:2)
看起来问题不是UIImage,而是NSData。在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];
答案 1 :(得分:0)
您不需要将-copy
发送到NSData对象。 UIImage
没有对周围的数据进行引用,只是读取它并生成图像。在没有-copy
的情况下发送-release
是内存泄漏。
然而,这并不能解释EXC_BAD_ACCESS
。还有其他事情正在发生,而不是你发布的代码。
答案 2 :(得分: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]];
答案 3 :(得分:0)
-(void )dealloc
{
if(self.Moins1!=nil)
{
self.Moins1 = nil;
}
}
当你给予和对象一个保留属性时,它的计数已经是1,当你分配它时,它的计数变为2,所以当调用dealloc时,它将检查它是否为零,如果它不是n,则使它为零。这样它会将变量的保留计数赋予0