3

我正在开发的应用程序的一部分涉及 UIPageViewController,其中每个页面都显示一个存储在 Core Data 中的“条目”。除其他外,条目包括一些正在压缩和存储为 NSData 的图像。因此,要加载这些图像并将它们显示在页面上,我使用 imageWithData,即

photo.image = [UIImage imageWithData:entry.photo];

问题是 imageWithData 不是特别快,因此翻阅页面没有我想要的响应速度。我补救这种情况的最佳尝试是将我的 UIPageViewController 显示的一些视图控制器预加载到一个数组中。(不确定这是否是最好的做法,但你有它)

所以,澄清一下,我有一个导航控制器,它包含 viewControllerA,然后链接到 viewControllerB - 它显示 UIPageView 和 entryControllers(每个页面上一个 entryController)。问题是当我使用导航栏从viewControllerB 回到viewControllerA 时,我希望viewControllerB 的entryControllers 数组从内存中释放。但是,ARC似乎没有这样做。因此,在 viewControllerA 和 viewControllerB 之间来回切换了几次,每次翻几页后,我开始收到内存警告——这最终会清除当前的 entryControllers 数组,并破坏了拥有该数组的目的,因为然后每次我收到内存警告时都必须重新加载条目。

简而言之,当我通过导航控制器返回 viewControllerA 时,ARC 并没有清除我为 viewControllerB 分配的任何内存。我不喜欢那样。如果有人可以提出发生这种情况的原因,或者让我知道我是否以错误的方式处理这整件事,我们将不胜感激。我只是想加快从一页到下一页的转换!

谢谢一堆。

4

2 回答 2

5

ARC 不释放您的内存的唯一原因是您仍将其保留在某个地方。只有你知道那是哪里。

通常,这是由保留周期引起的,这很容易发生在块中。

但是,您很可能将指向对象的指针保存在某个地方,在控制器、iVar 或某个集合中。

您是否在代码上运行过静态分析器?它非常擅长找到其中一些东西。

仪器告诉你什么?它有一些用于查找泄漏和保留周期的简洁工具。

编辑

您可以对所需的任何对象进行尽可能多的引用。一旦计数变为零,它将被释放。

问题是您持有一个强指针数组,将视图控制器作为缓存。如果您希望它们被释放,您必须手动将这些指针归零。您以某种方式将控制器预加载到数组中。他们会一直活着,直到你卸载它们。

所以,只要你有一个指向某个东西的强指针,它就会一直存在。

于 2012-08-04T03:03:27.357 回答
1

Jody 的编辑,特别提到了将指针设置为 nil,这让我在理解方面大有可为,最后,当我的“viewControllerB”消失时,我能够通过将某些指针设置为 nil 来找出我的问题。然而,一路走来,我还意识到另一个重要的一点——核心数据中的大图像是一个巨大的内存负担,在 iOS 5 中,可以通过设置允许外部存储的选项来解决这个问题。因此,对于像我这样的相对初学者并且可能遇到类似内存问题的任何其他人,这是限制存储大量数据的托管对象占用内存量的关键方法 - 您的图像(或任何大量数据) ) 会自动保存到文件中,而无需您在代码中做任何不同的事情。

于 2012-08-08T03:05:30.947 回答