首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少内存使用量

减少内存使用量
EN

Stack Overflow用户
提问于 2013-05-25 20:50:42
回答 3查看 975关注 0票数 1

因此,我正在开发一个iOS应用程序,它的基本功能如下:在iPhone上,它是一个有五个选项卡的UITabBarController,在iPad上,我有一个在右边有MKMapViewUISplitViewController,在左边有一个有四个选项卡的UITabBarController。该应用程序使用ARC。

假设我们谈论的是风景。

根据用户所在的当前城市,我的应用程序会将这个城市的所有景点下载到设备上。一旦某个视图被下载,它就存储在我的本地数据库中,这样用户就不必再下载它了。如果用户搜索另一个城市,该城市的所有景点将被下载。诸若此类。所有保存的景点都将在tableView或mapView中列出,并按城市进行排序。

景观包括:

  • 1-10幅图像
  • 元信息(标题,副标题,名称,描述,地址,城市,国家,等级,ID,纬度,经度))
  • 它属于1-n类/标签。

该应用程序允许用户创建新的景点,为其拍照,填写其元信息并上传到我的new服务器。

只要下载了一小部分景点,所有这些都能正常工作。在本地保存了40+景点之后,我收到了内存警告,应用程序退出了。问题是,这个应用程序的目的是浏览大量的景点,几百个。

现在,我想知道一些处理此类内存问题的技术。

我想我的问题是,随着我的应用程序的启动,所有本地保存的景点都作为tableView或mapView的数据源加载到一个数组中。但既然我想展示它们,我就只能这样做了。

其他应用程序如何处理由多个图像和大量元信息或类似信息组成的大量自定义对象?是否存在处理这类问题的最佳做法?

非常感谢您提前!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-26 05:47:47

关键的概念是,不应该将所有图像加载到数组/字典中。最多只能加载对这些图像的引用(例如,如果图像位于Documents文件夹中,只需加载图像的路径/URL)。然后,您的UI应该为那些图像创建UIImage,它需要在任何给定的点上呈现UI。

如果您使用的是表视图或集合视图,iOS非常优雅地处理这个问题,调用数据源的cellForRowAtIndexPath,只有在那个时候才能创建UIImage。当单元格滚动时,如果您遵循典型的cellForRowAtIndexPath实现,该单元格我们将被重用到表中的另一行,您将用一个新的UIImage重新分配单元格的image,并且考虑到旧图像可能没有更强的引用,它将被释放,图像所占用的内存将被释放。

另外还有几个想法:

  1. 您说该信息已下载到本地数据库中。您是下载图像的URL,还是实际将图像本身放到数据库中。根据我的经验,如果您处理的不是非常小的缩略图,您不希望将图像保存在数据库本身中(因为iOS数据库在保存大块方面效率很低),您将看到性能受到影响。如果图像每个大于100 in,则可能需要将图像下载到documents文件夹,并且只将图像的文件URL/路径存储在数据库中。
  2. 如果您的应用程序一次显示大量图像(例如,iPad应用程序,并且您有一个可以一次显示超过20幅图像的图片缩略图浏览器),那么您可能需要确保正在加载到UI中的图像大小适当。例如,虽然iOS可以优雅地拍摄高分辨率的图像,并通过一个带有UIViewContentModeAspectFill的小型UIImageView来显示缩略图,但这可能是内存的外溢使用。我使用了一个image resizing algorithm,通过它,我可以将图像大小调整到适合我的UI的大小,从而节省内存。如果你的图片很大,或者你同时显示了大量的缩略图,你只需要担心这个问题。
  3. 一旦您将应用程序更改为动态地将图像加载到UIImage对象中,您可能会对到目前为止可能还没有体验到的其他性能考虑因素变得敏感。典型的解决方案是使用缓存,通过缓存将最近加载的图像保存在NSCache对象中,但是如果设备内存不足,缓存将自动清空。因此,这是这两个世界中最好的;当您一次加载所有图像时,您已经习惯了这种性能,但是对于优雅地处理低内存情况,它具有更大的敏感性。顺便说一句,第三方类(如SDWebImage )会自动为您进行缓存。
票数 3
EN

Stack Overflow用户

发布于 2013-05-25 21:12:55

我处理大量图像的方法是

https://github.com/rs/SDWebImage

它为您缓存图像,下载它们,并在单独的线程上转储缓存,这样您就不必考虑这些内容了。

票数 2
EN

Stack Overflow用户

发布于 2013-05-25 21:00:59

您必须只加载您想要显示的数据的一些信息,例如ID、title,您将使用这些信息填充初始信息,其余的信息,如图像,您将需要在后台加载,并在它们准备好时进行更新,您可以查看这些答案,例如:

UICollectionView scrolling is slow

此外,当您的数据没有显示在屏幕上时,您必须注意不要使用所有的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16753779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档