【发布时间】: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