【问题标题】:Memory management of many UIImageViews许多 UIImageView 的内存管理
【发布时间】:2012-06-28 10:06:38
【问题描述】:

我正在制作一个 iOS 应用程序,如果内存不是问题,那么屏幕上会同时加载数千张图像。显然,这不是一个好方法,所以我想做的是“取消渲染”其中一些图像,以便在任何给定点上只有少数图像出现在屏幕上,然后在用户采取某些操作时“重新渲染”它们。所以我的问题是,我该怎么做?

或者,如果更简单的话,所有的图像都是一样的;我知道这听起来可能有点奇怪,但是是的,我的应用程序可能需要在屏幕上加载数千张相同的图像。既然是这种情况,内存管理是否真的不是问题,因为它们都将引用同一个文件? (这不是问题,我的意思是我可以使用hidden 属性来更改屏幕上的内容)。如果我能做到这一点,我就在做

UIImage *image = [[UIImage alloc] initWithContentsOfFile:@"image.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[scrollView addSubview:imageView];

(scrollView 是一个UIScrollView,我用来为UIImageView 提供捏缩放功能)。但问题是,当我这样做时,UIImageView 根本不会呈现。

当然感谢任何其他想法或建议,并提前感谢:D

【问题讨论】:

  • 重复:stackoverflow.com/questions/2507441/…>

标签: ios memory memory-management uiscrollview uiimageview


【解决方案1】:

答案取决于您的用户界面。当您说数千张图像时,一次可见多少张。它是不是有点像一个巨大的照片库,在任何给定时间实际上只有少数几个是可见的?在这种情况下,您可能只为当时可见的图像维护视图,而那些从可见屏幕滚动出来的视图在滚动之前不会有任何与之关联的视图(以及那些可见但现在滚动关闭将被释放)。

但是,如果您要处理不同的问题,大量的小图像,其中许多可能同时可见,那就是不同的问题(通过links 解决,就像 qegal 提供的那样)。

我假设您正在尝试做一些更像后者的事情,但无论如何,您必须让我们稍微更好地了解图像的性质以及我们在这里处理的用户体验类型。

更新:

听起来你做的更像是前者。那样的话……

查看PhotoScroller,这是 Apple 在大量图像集合中导航的示例(应用程序中只有三张图像,但您明白了)。

就我个人而言,我有一个低技术实现,我有一个照片浏览器,我在其中水平平移 (UIPanGestureRecognizer) 通过大量图像(大约 100 个,但也可以轻松很多)。但是,我的视图控制器只有三个 UIImageView 控件,一个用于显示主图像,一个用于上一个图像(它的框架设置在屏幕左侧),一个用于下一个图像(和它的框架设置在屏幕右侧)。当我收到来自 UIPanGestureRecognizer 的持续反馈时,我通过手势识别器的 translateInView 的水平部分调整所有三个帧(我见过其他使用滚动视图来协调图像移动的实现,但想法仍然是相同的)。当我放手时,我的手势识别器会判断我是否成功滑动到下一个或上一个图像,完成该动画,完成后,它重新定位三个 UIImageView(上一个离屏到左侧,当前在屏幕上,下一个离屏到右侧)并使用适当的“当前”、“上一个”和“下一个”图像重新加载三个图像视图。此时,您就可以使用手势识别器再次滑动。

【讨论】:

  • 我查看了 qegal 提供的链接,但问题是我想要的图像是 640x960,比该链接中的 17x1 大得多,并且在任何给定点都可以看到数百个图像,并且更多可能存在但不在屏幕上。我想要做的是从内存中删除当前不在屏幕上的那些,所以我不会使用大量内存来尝试一次渲染所有这些。我的情况更像你的第一个例子,但我对如何实现它有点困惑……有什么想法吗? :)
  • @user1226490 用两个解决方案更新了答案,Apple 的示例和我的原始解决方案(我在意识到 Apple 有这个示例项目之前就这样做了)。
  • 虽然这些都是好主意,但如果这就是我想要的,我仍然不是 100%。我有一个想法,但告诉我这是否行不通:我有一个代表每张图片的自定义类,并且这个类有一个UIImageView 类型的实例变量,即屏幕上的图片。 UIImage 存储在一个单例对象中,所以我并不总是在每次实例化一个新对象时都将新图片存储在内存中(这是真的吗?或者它会存储它们吗?)。如果我只是将每个UIImageView 中的UIImage 设置为nil,只要我不希望它出现在屏幕上,这会减少内存开销吗?
  • @user1226490 虽然我不确定我是否遵循您方法的所有细节(我什至不知道您的 UI 是什么;它是照片库还是其他什么?),它让我印象深刻的是,目标是拥有与图像关联的数百/数千个 UIImage 和/或 UIImageView 对象,但只有一个(或三个或任何您需要支持的最小子集您的 UI 及其动画),然后用您在给定时刻实际需要的少量图像填充 UIImages 和 UIImageViews。
  • @user1226490 虽然我理解 UIImage 单例在概念上的吸引力,但正如您所描述的那样,我不确定我是否想要拥有成百上千个 UIImageView 对象。而且我不确定我是否想要一个单例作为我的图像,因为如果并且当您进入屏幕上和屏幕外的图像动画时,周围有几个它们很有用。我会投票支持有限的 UIImageViews,每个都有它自己的 UIImage,并发挥你的 UI 魔法,让用户看起来像是在数千张图像之间导航,同时对操作系统施加的压力可以忽略不计。我的两分钱。
猜你喜欢
  • 2011-04-08
  • 2010-10-23
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多