iOS - ModalViewControllers的ARC /内存管理问题

时间:2012-01-09 15:23:41

标签: objective-c ios memory-management uiviewcontroller automatic-ref-counting

我正在编写一个应用程序(在iOS 5中使用ARC!),它在自定义UIViewController中呈现了数百个对象。我写过用户可以滚动浏览并选择,每个对象都显示为用户可能触摸的缩略图。

这些对象中的每一个都与一个特殊的UIViewController子类相关联,该子类处理与该对象关联的信息的自定义表示。例如,它可能是可以缩放和平移的图像,或者只是某些需要格式化的文本。

现在,我的每个图像对象都有一个与之关联的大图像。使用Instruments应用程序来分析我的代码并运行Activity Monitor,我发现当自定义UIViewController子类加载并显示图像时,每个大约需要5-10MB。这适用于一些图像,但最终我的应用程序占用了太多的内存和崩溃。

我已经用我的子类的-viewDidUnload方法编写了显然所有必要的东西来告诉ARC释放这个内存,但是在发出警告之前没有释放内存,这通常发生在应用即将发布时崩溃。有几次,我注意到如果我接近阈值但是没有超过它,我之前查看过的UIViewController子类最终会从内存中刷新,尽管{{1显然没有调用方法(而是将-viewDidUnload消息发送到我的自定义-didReceiveMemoryWarning)。但是,大多数情况下,我的应用程序因内存不足而崩溃。

所以我的核心问题是,我是否应该假设ARC尽快处理某个对象,或者它是否一直等到空间变紧?我想要的行为是自定义视图控制器及其数据立即刷新,以便内存永远不会成为问题。

我不相信对象到我的自定义视图控制器有任何强引用,我使用以下代码在主视图控制器中实例化它们:

UIViewControllers

其中[self presentViewController:[cObj grabModalViewController] animated:YES completion:nil]; 是包含对象信息的自定义类。 cObj只是实例化一个正确类型的对象并返回指针,因此一旦方法完成,大概应该删除对象的本地引用。

结果,当我稍后打电话

时,我希望如此
grabModalViewController

仅通过[self dismissModalViewControllerAnimated:YES]; 指向主视图控制器的自定义视图控制器应该从内存中刷新,但这不会发生。

这可能是因为我的自定义视图控制器对象中有强引用吗?

基本上我想要完成的是通过更好地预先处理事情来避免尽可能多的内存警告,但也许这不是正确的态度。

我很感激任何建议,我很乐意发布任何有用的代码。

1 个答案:

答案 0 :(得分:5)

  

所以我的核心问题是,我应该假设一个对象   尽快由ARC处理,或者总是等到   空间变得紧张?

ARC是一种编译时技术。它对运行时内存堆一无所知。因此,在空间变得紧张之前,它不能等待释放物品。对您的问题的具体答案是,ARC将在您不再需要时立即发布任何内容。