2011-01-10 208 views
7

我改变了UIImageview的图像[self setImage:newImage];(iphone)UIImageView setImage:泄漏?

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

谢谢

+1

你可以发布多一点的代码?你如何创建/填充newImage? – Axel 2011-01-10 08:41:07

回答

6

UIImageView setImage:从未泄露,除非你是通过图像不会得到释放。

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

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

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

+3

我做的事与你的代码基本相同。但是“乐器”表明,每当我这样做时,记忆力都在增加。在“乐器分配”中从“呼叫树”跳转到“统计”并回到“呼叫树”显示存储器返回到它应该在的位置。也许自动释放的对象在仪器中没有及时显示? – eugene 2011-01-10 14:08:05

+0

可能是..我不确定..但你可以发布代码如何创建和分配图像? – EmptyStack 2011-01-11 03:39:55

+0

[UIImage imageNamed:]会缓存图像数据,所以这可能是导致“泄漏”的原因。 – 2015-10-09 16:16:39

9

是的,UIImageView setImage确实泄漏! 其实,泄漏CGImage,不是的UIImage(如仪表 “分配” 节目)

我,而不是使用UIImage的BrutalUIImage

@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 
0

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

您知道吗?怎样绘制图片,保持PNG的透明? (当然,在调用“setImage:”时不会使用UIImageVIew来泄漏CGImage)

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]; 

我验证了这一点上我的代码为我的应用程序是通过对大型图像文件很多 循环。