在屏幕外卸载UIImageView的图像

时间:2010-06-08 05:22:26

标签: objective-c memory-management ipad

我在Ipad上编写应用程序,在我的应用程序的某个点上,我使用presentModalViewController呈现一个ViewController。

我的ViewController是一个UISScrollView,它占用了较大的modalView,在里面我显示了一些图像,我允许使用pagingEnabled,所以我可以在scrollView中看到我的所有图像。

有时候我必须在scrollView中显示10个以上的图像,所以我有这个错误 接收存储器警告级别= 1 在此接收存储器警告级别= 2 之后,由于信号10(Sigbus),调试器退出。

我该怎么办?有没有办法卸载屏幕外的图像?或其他事情要做?

谢谢,

2 个答案:

答案 0 :(得分:1)

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

您应该只添加实际可见的一个或两个图像。一旦它们滚出视线,请从UIImageView中移除UIScrollView(并确保不将其保留在其他位置,以便可以取消分配)。当新图像滚动显示时,仅将其添加到UIScrollView

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

答案 1 :(得分:0)

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

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

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

http://github.com/facebook/three20

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

如果你想自己烘焙这个功能,我会从UITableViewController中获取灵感。您的控制器应附带关联的数据源和委托协议,以检索照片并响应用户事件。控制器基类本身应该重用三个UIImageViews并且应该改变它们以创建用户滚动大型列表的错觉。