3

我正在写一个应用程序(在iOS 5中使用ARC!),在自定义内呈现数百个对象UIViewController我已经写道,用户可以滚动并选择,每它被呈现为用户可能触摸的缩略图图像。iOS - ARC /内存管理问题与ModalViewControllers

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

现在,我的每个图像对象都有一个与之相关的大图像。使用Instruments应用程序来剖析我的代码并运行活动监视器,当加载自定义UIViewController子类并显示图像时,我发现这些代码大约需要5-10MB。这对于少数图像来说很好,但最终我的应用占用了太多的内存和崩溃。

我在我的子类的-viewDidUnload方法中写了很明显的告诉ARC释放这个内存所需的所有东西,但是没有内存被释放,直到发出警告,这通常在应用即将崩溃时发生。有几次,我注意到如果我接近阈值但不过去,我以前查看的子类最终会从内存中刷新,尽管-viewDidUnload方法并没有明显被称为(相反,-didReceiveMemoryWarning消息发送到我的自定义UIViewControllers)。但是,大多数情况下,我的应用程序因为内存不足而崩溃。

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

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

[self presentViewController:[cObj grabModalViewController] 
        animated:YES completion:nil]; 

其中cObj是与对象的自定义类信息。 grabModalViewController只是简单地实例化一个正确类型的对象并返回指针,所以大概只要方法完成就应该抛弃对象的局部引用。

结果,我希望的是,当我后来打电话

[self dismissModalViewControllerAnimated:YES]; 

自定义视图控制器,只是指出要通过presentedViewController主视图控制器应该从内存中刷新,但这并不发生。

难道这是因为我有我的自定义视图控制器对象内的强引用?

本质上,我试图完成的是尽可能避免更多的内存警告,通过更好地管理事情,但也许这不是正确的态度。

我很感激任何建议,我很高兴发布任何和所有有用的代码。

+0

其实我意识到我说的话很蠢,显然,如果自定义视图控制器的内存每次都被回收,那么不能有强引用指向此对象。然而,我不明白为什么内存管理系统是不可靠的,因为有时我的应用程序崩溃而不是释放它知道的内存。我想这可能表明了更深层次的东西是错误的。 – ddodev 2012-01-09 15:35:07

+0

检查[cObj grabModalViewController]是否正在返回保留的对象。或者你可能有一个保留周期,你的模态视图控制器保留了对另一个对象中的实例变量的引用。这些都会阻止模态视图控制器被释放。 – timthetoolman 2012-01-09 15:44:22

+0

@timthetoolman感谢您的建议 - 但我相当肯定,这些都不是这种情况。 '[cObj grabModalViewController]'的方法体看起来像这样:'LightboxViewController * newController = [[LightboxImageViewController alloc] init]; [(LightboxImageViewController *)newController setImageFilename:self.imageFile]; return newController;'新的LightboxImageViewController具有'nonatomic,copy'的imageFile属性。我认为有'保留'会导致问题,但是假设这些可以使用'copy'来解决。 – ddodev 2012-01-09 15:46:50

回答

5

所以我的核心问题是,我应该承担的对象将通过ARC尽快予以处置可能 呢,还是一直等到 空间变得紧张?

ARC是一种编译技术。它对你的运行时内存堆一无所知。因此,它迫不及待地放下物品,直到空间变得紧张。你的问题的一个具体答案是ARC会在你不再需要它时立即发布。

+0

或换句话说:* ARC不是垃圾收集*。 – 2012-12-18 21:23:28