【问题标题】:Unload image of UIImageView thats offscreen卸载屏幕外 UIImageView 的图像
【发布时间】:2011-03-01 00:14:29
【问题描述】:

我正在 Ipad 上编写一个应用程序,在我的应用程序的某个位置,我展示了一个带有 presentModalViewController 的 ViewController。

我的 ViewController 是一个 UISScrollView,它采用较大的 modalView 并在其中显示一些图像,我允许 pagingEnabled 以便我可以在 scrollView 中看到我的所有图像。

有时我必须在滚动视图中显示超过 10 个图像,所以我有这个错误 在此 RECEIVE MEMORY WARNING LEVEL=2 之后RECEIVE MEMORY WARNING LEVEL=1,最后调试器因信号 10 (Sigbus) 而退出。

我能做什么?有没有办法卸载屏幕外的图像?还是其他事情要做?

谢谢,

【问题讨论】:

    标签: objective-c memory-management ipad


    【解决方案1】:

    我猜你要将所有图像添加到UIScrollView?然后 iPad 必须将所有 10 张图像保存在内存中。如果它们是全屏图像,每个图像将占用大约 3 MB 的内存,因此您使用 30MB 只是为了将 10 个图像保留在滚动视图中。

    您应该只添加一个或两个实际可见的图像。一旦他们滚动到视线之外,从您的UIScrollView 中删除UIImageView(并确保您不会将它保留在其他任何地方,以便可以释放它)。当新图像滚动到视线中时,才将其添加到UIScrollView

    在您的UIScrollViewDelegate 方法-scrollViewDidScroll: 中获取当前的contentOffset 并使用它来计算哪些图像是可见的。

    【讨论】:

      【解决方案2】:

      实际上,这个问题在 iPhone 3G 上更严重,它甚至无法同时显示两张全尺寸照片(用自己的相机拍摄)。

      如果您可以通过调整大小提前缩小照片(如果您从自己的服务中获取照片,则为服务器端,如果它们是在设备上以某种方式生成或从第三方服务中检索,则为客户端),你应该。它们的加载速度会更快,您可以一次将更多它们放在屏幕上,而不会遇到内存问题。

      Three20 库为 iPhone 提供了非常棒的照片浏览控件。我很确定他们在任何给定时间都只有三张照片……您正在看的照片,以及前进或后退的照片。

      http://github.com/facebook/three20

      我还认为 Three20 控件有一个 iPad 分支(位于 ./tree/ipad),虽然我不知道它们是否包含照片浏览器,并且我自己还没有尝试过......如果您不想在应用程序的特定功能上花费大量时间,也许这是您的一个选择。如果 iPad 照片浏览器没有完成,也许你可以调整 iPhone 版本来满足你的需要(应该不难)。

      如果你想自己烘焙这个特性,我会从 UITableViewController 中获得一些灵感。你的控制器应该带有相关的数据源和委托协议来检索照片和响应用户事件。控制器基类本身应该重用三个 UIImageView,并且应该将它们打乱,以创造用户正在滚动浏览一个大列表的错觉。

      【讨论】:

      • PS。)来自链接的帖子;如果您对如何在滚动视图中制作“虚拟页面”感兴趣,请查看:cocoawithlove.com/2009/01/…
      猜你喜欢
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多