(iphone)UIImageView setImage:泄漏?
我正在改变UIImageView的图像[self setImage:newImage];
看起来每次我用newImage去做,以前的图像似乎都没有被释放。
什么是replaceUIImageView图像的正确方法?
谢谢
UIImageView setImage:
永远不会泄漏,除非你传递的图像没有被释放。
你的代码不会泄漏,如果你正在分配一个自动发布的图像到图像视图,如下所示。
UIImage *newImage = [UIImage imageNamed:@"sampleImage"]; [yourImageView setImage:newImage];
但是,如果您在某处分配图像,则必须手动将其释放。
是的,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
你的BrutalUIImageVIew类非常有趣,但是通过使用UIImage“drawInRect:”方法绘制图像,我丢失了我的PNG文件的透明区域。
你知道如何绘制图像,保持PNG透明吗? (当然,在调用“setImage:”的时候不会使用UIImageVIew来泄漏CGImage)
是的UIImageView setImage确实泄漏!
如果你通过一堆图像循环
[yourImageView setImage:[UIImage imageNamed:@"sampleImage.png"]];
你可以在仪器上看到内存使用量的增加。 这似乎是某种caching四处走动后,通过所有的图像循环内存使用将会持平。
正确的或者至less是不漏的方式是:
NSString *thePath = [[NSBundle mainBundle] pathForResource:@"sampleImage" ofType:@"png"]; UIImage *newImage = [[UIImage alloc] initWithContentsOfFile:thePath]; [yourImageView setImage:newImage];
我在我的代码上validation了这一点,因为我的应用程序正在循环大量的大图像文件。