iPhone内存管理,使我的应用程序可以防止多个设备崩溃

时间:2010-11-25 14:29:09

标签: iphone memory-management didreceivememorywarning

我正在开发一个应用程序,它使用UIScrollView根据搜索条件显示图像列表。使用按钮,用户可以加载更多图像。

在iPhone 4上进行测试时,ViewController会收到~750张图像的内存警告。在第2代iPod上进行测试时,会收到约150张图像的内存警告。

我的理解是,当调用didReceiveMemoryWarning时,可以通过释放对象来释放内存,但不能保证从低内存中恢复。

我已经实现了didReceiveMemoryWarning并基本上释放了所有对象。在乐器中我看到内存使用量下降到~3MB。 iPod第一次达到内存限制一切顺利,内存被释放,应用程序恢复正常运行。然而,第二次,当调用didReceiveMemoryWarning时,我可以看到发布的对象,但应用程序无论如何都会崩溃。

那么,我如何让我的应用程序崩溃证明?我想确保运行应用程序的所有设备都可以加载尽可能多的内存允许的图像,但我也想确保应用程序不会崩溃。

我希望应用程序永远不会达到didReceiveMemoryWarning并设置可以显示的图像数量的限制,但是如何确定每个可能的设备应该能够加载多少图像?

此外,无法保证图像的大小。在测试时,我在iPod上任意数量为150,但是如果某个时间点服务器上的图像大两倍呢?然后应用程序可能会崩溃75张图像。

任何sugestions?

2 个答案:

答案 0 :(得分:1)

首先,您可能想要做的就是不能同时显示所有图像。您更确切地说,可能只想禁用当前可见的图像,以及当用户滚动到该位置时预先加载的一些图像。

这与照片应用的工作方式大致相同,UITableView的实施方式。基本上它归结为:

你有主滚动视图,在里面,你有单独的单元格。这些单元格是小视图,在特定偏移处作为子视图添加到滚动视图。然后将图像添加到这些单元格中。

当用户滚动滚动视图时,您首先要求滚动视图为您出一个新单元格,就像您要求表格视图将单元格出列以供您使用一样。如果已经回收了分配成本,则可以节省分配成本。如果你不能从一个回收套装中取出一个,那么你要做的很简单:按照你现在的做法分配一个。

此外,要实现此细胞回收,您需要做的是查看屏幕上可见的细胞。如果一个或多个单元格脱离屏幕,则将它们添加到您创建的回收单元格NSSet中。该套装只容纳细胞以供日后回收。 Apple有一些示例代码可以证明这一点,它被称为 PhotoScroller 。它也在WWDC10视频会话104中得到了证明。我建议你观看它。忽略关于平铺的部分,你不需要知道为了你的目的。

一旦你有了这个,这将迫使你只在需要时设置你的细胞,这也是这种行为的另一个关键方面。

最后,当您收到内存警告时,只需删除已回收的单元格集。如果你得到足够高的重要性,那就是,你将节省几美分的记忆。 :)(不要忘记实现它,但是,当你持有你并不特别需要的临时数据时......在屏幕上看不到的单元格就是一个很好的例子,就像缓存一样。)

答案 1 :(得分:0)

您应该懒得加载图片,只加载当时需要的图片。您的应用程序无法在一个屏幕上显示所有这些图像,因此在您的滚动视图中,您应该只加载那些可以放在屏幕上的图像,也许只是围绕它的一些图像,并且当用户滚动以释放它不再需要的图像时。