如何解决这个内存泄漏(iPhone)?

时间:2009-07-31 14:54:49

标签: objective-c iphone xcode memory-management

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

4 个答案:

答案 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