【问题标题】:(iphone) UIImageView setImage: leaks?(iphone) UIImageView setImage:泄漏?
【发布时间】:2011-06-06 09:44:19
【问题描述】:

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

似乎每次我对 newImage 执行此操作时,似乎都没有发布之前的图像。
替换 UIImageView 的图像的正确方法是什么?

谢谢

【问题讨论】:

  • 你能多贴一点代码吗?您如何创建/填充 newImage?

标签: iphone objective-c ios image uiimageview


【解决方案1】:

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

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

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

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

【讨论】:

  • 我所做的与您的代码所做的基本相同。但是“仪器”显示每次我这样做时内存都会增加。在“仪器分配”中从“调用树”到“统计”并返回到“调用树”显示内存回到它应该在的位置。可能自动释放的对象在仪器中没有及时正确显示?
  • 可能是..我不确定..你能发布你如何创建和分配图像的代码吗?
  • [UIImage imageNamed:] 将缓存图像数据,因此这可能是导致“泄漏”的原因。
【解决方案2】:

是的,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

【讨论】:

    【解决方案3】:

    你的 BrutalUIImageVIew 类真的很有趣,但是通过使用 UIImage "drawInRect:" 方法绘制图像,我丢失了我的 PNG 文件的透明区域。

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

    【讨论】:

    • 尝试在BrutalUIImageView init方法中设置self.opaque = NO;
    【解决方案4】:

    是的 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 循环了很多次 大图像文件。

    【讨论】:

    • 你看到的不是 UIImageView 泄漏,而是缓存在 [UIImage imageNamed:]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多