我正在通过[self setImage:newImage]改变UIImageview的图像;
看起来每次我使用newImage时,之前的图像似乎都没有被释放 替换UIImageView图像的正确方法是什么?
谢谢
答案 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正在循环很多 大图像文件。