因此,我正在开发一个iOS应用程序,它的基本功能如下:在iPhone上,它是一个有五个选项卡的UITabBarController,在iPad上,我有一个在右边有MKMapView的UISplitViewController,在左边有一个有四个选项卡的UITabBarController。该应用程序使用ARC。
假设我们谈论的是风景。
根据用户所在的当前城市,我的应用程序会将这个城市的所有景点下载到设备上。一旦某个视图被下载,它就存储在我的本地数据库中,这样用户就不必再下载它了。如果用户搜索另一个城市,该城市的所有景点将被下载。诸若此类。所有保存的景点都将在tableView或mapView中列出,并按城市进行排序。
景观包括:
该应用程序允许用户创建新的景点,为其拍照,填写其元信息并上传到我的new服务器。
只要下载了一小部分景点,所有这些都能正常工作。在本地保存了40+景点之后,我收到了内存警告,应用程序退出了。问题是,这个应用程序的目的是浏览大量的景点,几百个。
现在,我想知道一些处理此类内存问题的技术。
我想我的问题是,随着我的应用程序的启动,所有本地保存的景点都作为tableView或mapView的数据源加载到一个数组中。但既然我想展示它们,我就只能这样做了。
其他应用程序如何处理由多个图像和大量元信息或类似信息组成的大量自定义对象?是否存在处理这类问题的最佳做法?
非常感谢您提前!
发布于 2013-05-26 05:47:47
关键的概念是,不应该将所有图像加载到数组/字典中。最多只能加载对这些图像的引用(例如,如果图像位于Documents文件夹中,只需加载图像的路径/URL)。然后,您的UI应该为那些图像创建UIImage,它需要在任何给定的点上呈现UI。
如果您使用的是表视图或集合视图,iOS非常优雅地处理这个问题,调用数据源的cellForRowAtIndexPath,只有在那个时候才能创建UIImage。当单元格滚动时,如果您遵循典型的cellForRowAtIndexPath实现,该单元格我们将被重用到表中的另一行,您将用一个新的UIImage重新分配单元格的image,并且考虑到旧图像可能没有更强的引用,它将被释放,图像所占用的内存将被释放。
另外还有几个想法:
UIViewContentModeAspectFill的小型UIImageView来显示缩略图,但这可能是内存的外溢使用。我使用了一个image resizing algorithm,通过它,我可以将图像大小调整到适合我的UI的大小,从而节省内存。如果你的图片很大,或者你同时显示了大量的缩略图,你只需要担心这个问题。UIImage对象中,您可能会对到目前为止可能还没有体验到的其他性能考虑因素变得敏感。典型的解决方案是使用缓存,通过缓存将最近加载的图像保存在NSCache对象中,但是如果设备内存不足,缓存将自动清空。因此,这是这两个世界中最好的;当您一次加载所有图像时,您已经习惯了这种性能,但是对于优雅地处理低内存情况,它具有更大的敏感性。顺便说一句,第三方类(如SDWebImage )会自动为您进行缓存。发布于 2013-05-25 21:12:55
发布于 2013-05-25 21:00:59
您必须只加载您想要显示的数据的一些信息,例如ID、title,您将使用这些信息填充初始信息,其余的信息,如图像,您将需要在后台加载,并在它们准备好时进行更新,您可以查看这些答案,例如:
UICollectionView scrolling is slow
此外,当您的数据没有显示在屏幕上时,您必须注意不要使用所有的信息。
https://stackoverflow.com/questions/16753779
复制相似问题