ARC在导航控制器中"返回"时不释放内存 - 而且它正在减慢我的uipageviewcontroller

cow*_*boo 3 uinavigationcontroller ios automatic-ref-counting

我正在处理的应用程序的一部分涉及UIPageViewController,其中每个页面显示存储在Core Data中的"条目".除了别的以外,条目还包括一些被压缩并存储为NSData的图像.因此,要加载这些图像并将它们显示在页面上,我正在使用imageWithData,即

photo.image = [UIImage imageWithData:entry.photo];
Run Code Online (Sandbox Code Playgroud)

问题是imageWithData不是特别快,因此翻页不像我想的那样响应.解决这种情况的最佳尝试是将我的UIPageViewController显示的一些视图控制器预加载到一个数组中.(不确定这是否是最好的事情,但你有它)

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

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

谢谢一堆.

Jod*_*ins 5

ARC不释放记忆的唯一原因是你仍然在某处保留它.只有你知道那是哪里.

通常,这是由保留周期引起的,这可以通过块轻松实现.

但是,您可能会在某个位置,控制器,iVar或某些集合中保留指向对象的指针.

您是否在代码上运行静态分析器?找到其中的一些东西非常好.

乐器告诉你什么?它有一些用于发现泄漏和保留循环的简洁工具.

编辑

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

问题是你持有一个强指针数组来查看控制器作为缓存.如果你想要它们发布,你必须手动nil这些指针.您以某种方式将控制器预加载到阵列中.他们会活着,直到你卸下它们.

所以,只要你有一个强大的指针指向某个东西,它就会保持不变.