0

this is probably a newbie question...

I'm trying to reduce the amount of memory usage in my iPhone app.

I have an UIViewController with a set of buttons. When the user taps any of them, the app takes him to a new screen (new UIViewController).

Should I create them on demand ([[MyUIViewController alloc] initWithNibName:@"MyUIViewController" bundle:nil];), or should I have all these UIViewControllers as @propertys in the "main" controller, and create them only the first time? (check if they are nil).

I noticed (with Instruments) that, following the first approach, the used memory (Live bytes) increases on push but does not decrease when pulling the controller, and so on every time I press a button.

Furthermore, does that also applies to UITableViews, where I push another UIViewController in tableView:didSelectRowAtIndexPath: method?

Thank you in advance.

EDIT: I'm using ARC

4

5 回答 5

1

你说:

我注意到(使用 Instruments),按照第一种方法,使用的内存(实时字节)在推动时增加,但在拉动控制器时不会减少,等等每次我按下按钮时。

因此,当您从 VC1 转到 VC2 时,您是说内存使用量显着增加,但当您返回 VC1 时并没有下降?你检查过你的代码是否有泄漏吗?首先,通过静态分析器 ( shift++ command)运行它B,它可以识别一些最严重的错误。你应该有零警告。

其次,通过分析器通过 Instruments 运行您的代码以识别任何泄漏。请参阅仪器用户指南的“查找泄漏”部分。

于 2012-07-07T17:35:19.250 回答
0

保留它们并重用它们将使您的应用程序的基本内存保持在更高的水平,但可能会提高性能,因为这些不需要按需重新创建。

话虽如此,推送新视图控制器的性能一开始并不是很糟糕(除非你做错了什么),所以只需按需创建它们。

如果旧的 VC 内存在弹出时没有被释放,您可能在某处有一个保留周期。查找您可能编写的在关闭视图时未清除的任何委托代码。

于 2012-07-07T17:20:28.997 回答
0

在这里与@RobertRyan 聊天后(我想链接会保留),他给了我解决方案:问题是我的 VC2 中有一个保留周期(请看一下聊天,所以我不会在这里重写所有内容) . 非常感谢@RobertRyan!

于 2012-07-07T19:21:40.960 回答
0

通常, aUIViewController应该在内存上相当轻。这UIView是您可以节省最多内存的对象,方法是确保您熟悉视图生命周期并让视图得到清理(通过不在视图控制器view属性之外的任何地方保存对它们的引用并设置任何其他视图参考nilviewDidUnload。这里有一个关于如何使用的好答案viewDidUnload

话虽如此,只要创建视图控制器不是很重,最好在需要时重新创建它们。这不是出于记忆的原因,而是为了简单。因此,除非您出于其他原因需要在属性中保留对它们的引用,否则请保持简单并使用更少的代码 - 只需根据需要创建它们。

于 2012-07-07T17:27:23.610 回答
0

这可能是一个新手答案,所以请持保留态度。

在这种情况下,我从不担心在代码中实现我的视图控制器。我使用情节提要创建初始视图控制器并将其嵌入到导航控制器中。然后,我创建后续视图控制器,并通过命名segue(通过控制拖动)将它们链接到初始控制器视图的适当部分。我认为通过使用这种技术,链中的视图控制器只有在其 segue 触发后才会被实例化。我确信 Apple 已经对此进行了优化,因此我相信通过使用情节提要,我将节省更多的内存,而不是试图在代码中摆弄东西。

于 2012-07-07T17:27:55.763 回答