Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何解决此内存泄漏(iPhone)?_Objective C_Iphone_Xcode_Memory Management - Fatal编程技术网

Objective c 如何解决此内存泄漏(iPhone)?

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

如何在没有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 *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;
     }
   }