gpt4 book ai didi

iPhone 内存管理,使我的应用程序在多个设备上不会崩溃

转载 作者:行者123 更新时间:2023-12-03 21:21:21 25 4
gpt4 key购买 nike

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

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

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

我已经实现了 didReceiveMemoryWarning 并释放了基本上所有的对象。在仪器中,我发现内存使用量回落至约 3MB。 iPod 第一次达到内存限制时,一切顺利,内存被释放,应用程序恢复正常运行。然而,第二次,当调用 didReceiveMemoryWarning 时,我可以看到释放的对象,但应用程序还是崩溃了。

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

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

此外,图像的大小无法保证。在测试时,我在 iPod 上得到了 150 个任意数字,但如果服务器上的图像在某个时间点是两倍大怎么办?那么应用程序可能会在 75 张图像时崩溃。

有什么建议吗?

最佳答案

首先,您可能想要做的不是一次显示所有图像。相反,您可能只想禁用当前可见的图像,以及当用户滚动到该位置时预加载的一些屏幕外图像。

这与照片应用程序的工作方式非常相似,即 UITableView 的实现方式。基本上可以归结为:

您有主 ScrollView ,其中有单独的单元格。这些单元格是小 View ,它们作为 subview 以特定偏移量添加到 ScrollView 中。然后将图像添加到这些单元格中。

当用户滚动 ScrollView 时,您首先要求 ScrollView 为您出队一个新单元格,这与您要求 TableView 出队一个单元格供您使用的方式非常相似。如果已回收的话,这可以节省分配成本。如果您无法从回收集中出列一个,那么您要做的非常简单:像当前所做的那样分配一个。

此外,要实现此单元格回收,您需要做的是查看哪些单元格在屏幕上可见。如果一个或多个单元格离开屏幕,您可以将它们添加到您创建的回收单元格 NSSet 中。该装置仅容纳电池以供以后回收。苹果有一些示例代码演示了这一点,它被称为PhotoScroller。 WWDC10 视频第 104 场也对此进行了演示。我建议您观看。忽略有关平铺的部分,您不需要为了您的目的而了解这一点。

一旦您完成此操作,这将迫使您仅在需要时才设置单元,这也是此行为的另一个关键方面。

最后,当您收到内存警告时,只需删除回收的单元集即可。如果你达到足够高的水平,这很重要,也就是说,你将节省几兆内存。 :) (但是,当您保留不需要的临时数据时,请不要忘记实现它......屏幕上不可见的单元格就是一个很好的例子,缓存也是如此。)

关于iPhone 内存管理,使我的应用程序在多个设备上不会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4278103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com