【问题标题】:Does UIImageView cache images?UIImageView 是否缓存图像?
【发布时间】:2012-01-06 09:40:21
【问题描述】:

可能我会问其他人问的相同问题(但没有回应):
Speed up first UIImageView animation (force cache the images)

但是,我的简短问题是:
我在资源中有 60 张图像,在时间间隔循环中,我将为这些图像设置动画,每次设置为 UIImageView.image 来自资源的 n'th 图像。

问题是:第一个动画很糟糕!当我在同一个 UIImageView 中再次循环所有图像时,动画是完美的。我们可以在 UIImageView 中预先缓存图像吗?

编辑:或者我们可以做一些技巧,让动画更流畅?

【问题讨论】:

    标签: ios caching animation uiimageview image-manipulation


    【解决方案1】:

    方法 [UIImage imageNamed:@""] 缓存图像。 UIImageView 没有。我在一个应用程序中遇到了一个问题,其中有很多图像由于内存不足而崩溃。 修复如果我更改为不缓存图像的[UIImage imageWithContentsOfFile:@""]

    要预先缓存图像,您只需在 init 方法中为您想要的所有图像调用[UIImage imageNamed:@""]。但是,如果您收到内存警告,图像将被释放。

    【讨论】:

    • 也许吧,但我们谈论的是 UIImageView,而不是 UIImage
    • 是的!在使用 imageNamed 分析应用程序期间,我的应用程序占用了 120mb 内存,使用 imageWithContentsOfFile 时内存为 15mb。但不幸的是它并没有解决糟糕的动画问题(
    • 您是否尝试在第一次使用 [UIImage imageNamed:@""] 调用动画之前实例化所有图像?
    • 不!我认为这会导致内存警告
    • @BrunoDomingues 你说使用 imageNamed,应用程序由于内存不足而崩溃,但是你说当你的应用程序收到内存警告时缓存中的图像被释放 ??
    【解决方案2】:

    UIImageView 不会像[UIImage imageNamed:@""] 那样缓存图像。不幸的是,如果您有很多图像,imageNamed 会因为内存不足而导致您的应用程序崩溃。

    您可以使用[UIImage imageWithContensOfFile:@""] 预加载 NSArray 中的所有图像。 一旦你有了数组,你就可以为所欲为!

    【讨论】:

    • 我觉得这很奇怪!.. NSArray 还会在其内部保留图像的内存,以及由 imageNamed 缓存的图像。还是?
    【解决方案3】:

    不,UIImageView 不缓存图像。 image 属性声明为保留,因此当您设置新图像时,imageView 将release 消息发送到旧图像,retain 发送到新图像。

    动画 UIImageView 最简单的方法是将图像数组设置为属性animationImages 并调用startAnimating 方法

    imageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"1.png"], ..., nil];
    imageView.animationDuration = 2.0f;
    [imageView startAnimating];
    

    【讨论】:

    • 但是,你有没有尝试过使用 UIImageView.animationImages 为 100 张图片制作动画,每张图片的大小为 850x535?我试过了,app因为内存而崩溃了。我认为的原因是,因为animationImages保存了所有的图像,这是很多内存。或者,我说错了吗??如果是这样,请纠正我。谢谢
    • 是的,我猜你完全正确。如您所见,这种方式最简单,但效率不高。
    • 你认为,我应该使用一些图形库来播放大图像,保持性能良好吗?你知道任何?谢谢
    • @AlmasAdilbek,您可以使用默认的 UIKit 类来实现。如果你的第一种方法得到奇怪的结果,那么试试这个。当前时间只显示 1 个 imageView,当你想显示下一个图像时,然后从 superView 中删除 imageView 并使用新图像创建新的图像
    • imageNamed 方法确实将图像缓存在内存中。可以在这个 SO 答案中找到处理许多图像的工作解决方案:stackoverflow.com/questions/442076/…
    猜你喜欢
    • 2012-01-28
    • 2012-01-14
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2016-06-17
    • 2012-11-29
    相关资源
    最近更新 更多