(iphone)UIImageView setImage:泄漏?

时间:2011-01-10 08:33:59

标签: iphone objective-c ios image uiimageview

我正在通过[self setImage:newImage]改变UIImageview的图像;

看起来每次我使用newImage时,之前的图像似乎都没有被释放 替换UIImageView图像的正确方法是什么?

谢谢

4 个答案:

答案 0 :(得分:9)

是的,UIImageView setImage漏了! 实际上,泄漏CGImage,而不是UIImage(作为仪器“分配”显示)

我使用BrutalUIImage而不是UIImage

@interface BrutalUIImageView : UIView {
    UIImage *image;
}

@property(nonatomic, retain) UIImage *image;

@end

@implementation BrutalUIImageView
@synthesize image;

- (void)setImage:(UIImage *)anImage {
    [image autorelease];
    image = [anImage retain];
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    [image drawInRect:rect];
}

- (void)dealloc {
    [image release];
    [super dealloc];
}

@end

答案 1 :(得分:6)

UIImageView setImage:永远不会泄漏,除非你传递的图像没有被释放。

如果您要将自动释放的图像分配给图像视图,则代码不会泄漏,如下所示。

UIImage *newImage = [UIImage imageNamed:@"sampleImage"];
[yourImageView setImage:newImage];

但是,如果要在某处分配图像,则必须手动释放它。

答案 2 :(得分:0)

您的BrutalUIImageVIew类非常有趣,但是通过使用UIImage“drawInRect:”方法绘制图像,我丢失了PNG文件的透明区域。

你知道如何绘制图像,保持PNG的透明度吗? (当然,在调用“setImage:”时不使用UIImageVIew泄漏CGImage)

答案 3 :(得分:0)

是的UIImageView setImage确实泄漏了!

如果你用

循环一堆图像
   [yourImageView setImage:[UIImage imageNamed:@"sampleImage.png"]];

你可以看到仪器内存使用量的增加。 从那以后,这似乎是某种缓存 循环浏览所有图像内存使用情况将会持平。

正确的,或者至少是非泄漏的方式是:

   NSString *thePath = [[NSBundle mainBundle] pathForResource:@"sampleImage" ofType:@"png"];
   UIImage *newImage =  [[UIImage alloc] initWithContentsOfFile:thePath];
   [yourImageView setImage:newImage];

我在我的代码上验证了这一点,因为我的APP正在循环很多 大图像文件。