Objective c 如何解决此内存泄漏(iPhone)?
如何在没有EXC_BAB_访问权限的情况下释放此变量Objective c 如何解决此内存泄漏(iPhone)?,objective-c,iphone,xcode,memory-management,Objective C,Iphone,Xcode,Memory Management,如何在没有EXC_BAB_访问权限的情况下释放此变量 //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 *Moi
//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;
看起来问题不是UIImage,而是NSData。在Cocoa中,任何copy(或mutableCopy)方法都返回一个带有+1 retain计数的对象,这意味着您拥有它,因此负责释放它 在代码中,对myg.imageData调用-copy,但从不释放它。这是一个典型的内存泄漏示例。下面是我将如何修复它,再加上稍微更改一下语法: ivar: 实施:
NSData * imageData = [myg.imageData copy];
UIImage * ImageAvatar = [[UIImage alloc] initWithData:imageData];
[imageData release];
[self setMoins1:ImageAvatar];
[ImageAvatar release];
您不需要向NSData对象发送
-copy
UIImage
不保留对周围数据的引用,它只是读取数据并生成图像。发送-copy
而不发送-release
是内存泄漏
但是,这并不能解释EXC\u BAD\u访问的原因。正在发生其他事情,而不是您发布的代码。您的代码中有两个问题。按照其他贡献者的指示复制
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]];
查看当你给和对象一个retain属性时,它的计数已经是1,当你分配它时,它的计数变成2。因此,当调用dealloc时,它将检查它是否为nil,如果不是nil,则将其设为nil。这样,它将把变量的retain计数设为0,除非你有充分的理由打破Obj-C惯例,变量应该有一个小写的第一个字母-‘ImageAvatar’应该是‘ImageAvatar’,而‘Moins1’应该是‘Moins1’。与其只发布一段代码,不如解释一下为什么这段代码解决了这个问题。没有解释,这不是答案。
self.Moins1 = [UIImage imageWithData:[[myg.imageData copy] autorelease]];
-(void )dealloc
{
if(self.Moins1!=nil)
{
self.Moins1 = nil;
}
}