【问题标题】:UIImage setImage: cause memory leakUIImage setImage:导致内存泄漏
【发布时间】:2012-04-02 13:01:49
【问题描述】:

我从一个非常简单的函数中遇到了内存泄漏问题。这是我的代码:

  -(void) drawPuzzle
 {

      gameView.image=nil;     

      UIGraphicsBeginImageContext(gameView.frame.size);


      [gameView.image  drawInRect:CGRectMake(0,
                                             0, 
                                             gameView.frame.size.width,
                                             gameView.frame.size.height)];



       CGContextRef con=UIGraphicsGetCurrentContext();
       CGContextMoveToPoint(con, 20,0);
       CGContextAddLineToPoint(con,20, gameView.frame.size.height);
       CGContextStrokePath(con);


       UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
       UIGraphicsEndImageContext();
       [gameView setImage:newImage];


  }

仪器报告如下:

Event Type    RefCt      Responsible Caller

Malloc        1          +[UIImage imageWithCGImage: scale: orientation:] 
Autorelease              +[UIImage imageWithCGImage: scale: orientation:] 
Retain        2          -[UIImageView setImage:]
Release       1          -[NSAutoreleasePool drain]       

【问题讨论】:

  • 你们发布了 gameView.image 吗? (假设被setImage保留)
  • 怎么样? [gameView.image 发布] 还是 gameView.image=nil?我不知道为什么我需要 [gameView.image release] 但我在 [gameView release] 之​​前做了 gameView.image=nil。
  • 谢谢,在我添加 gameView.image=nil;[gameView.image release]; [游戏视图发布];到我的 dealloc 函数内存泄漏消失了。但是我仍然不明白为什么我需要做[gameView.image release],因为我从不保留或分配gameView.image。这不是我第一次将图像设置为 UIImageView.image 我以前不需要发布 **.image 东西?
  • 当您合成一个可保留属性时,它的 set 方法会为您保留该对象。因此,当您调用 setImage 时,会为您调用 [gameView.image retain]。这就是为什么你需要在 dealloc 发布 gameView.image
  • 我还是不明白。 gameView 是 UIImageView 的一个对象。 image 是 UIImageView 的一个可保留属性。但是为什么释放 UIImageView 的可保留属性是我的责任。 [图片发布] 应该包含在 UIImageView 的 dealloc 方法中。我现在真的很困惑。

标签: ios objective-c memory-leaks uiimageview uiimage


【解决方案1】:

setImage: 方法保留了您的 newImage。为避免内存泄漏,您需要在setImage 之后释放newImage

   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
   UIGraphicsEndImageContext();
   [gameView setImage:newImage];
   [newImage release];

【讨论】:

  • 这没有意义。即使 setImage: 保留了 newImage 也不应该是我释放它的责任。我试过了,代码崩溃了。
  • 调用者不负责释放具有Get语义的函数的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多