每次我想推送它时,我应该创建一个UIViewController吗?

时间:2012-07-07 17:10:16

标签: ios memory-management uiviewcontroller

这可能是一个新手问题...

我正在尝试减少iPhone应用中的内存使用量。

我有一个带有一组按钮的UIViewController。当用户点击其中任何一个时,应用程序将他带到一个新的屏幕(新的UIViewController)。

我应该按需创建它们([[MyUIViewController alloc] initWithNibName:@“MyUIViewController”bundle:nil];),还是应该将所有这些UIViewControllers作为{main}控制器中的@property s,并且只在第一次创建它们? (检查它们是否为nil)。

我注意到(使用Instruments),在第一种方法之后,使用的内存(实时字节)在按下时会增加,但在拉动控制器时不会减少,依此类推每次按下按钮。< / p>

此外,这是否也适用于UITableViews,我在tableView:didSelectRowAtIndexPath:方法中推送另一个UIViewController?

提前谢谢。

编辑:我正在使用ARC

5 个答案:

答案 0 :(得分:1)

你说:

  

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

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

其次,通过仪器通过仪器运行代码以识别任何泄漏。请参阅Instruments User Guide的“查找泄漏”部分。

答案 1 :(得分:0)

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

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

如果弹出时未释放旧的VC内存,则可能会在某处保留一个保留周期。查找您可能已编写的任何代理代码,但在解除视图时无法清除。

答案 2 :(得分:0)

通常,UIViewController应该对内存相当轻松。通过确保您熟悉视图生命周期并让视图得到清理(通过不在视图控制器外部的任何位置保持对它们的引用),可以节省最多内存的UIView个对象view属性,并在nil中设置对viewDidUnload的任何其他视图引用。有good answer here关于如何使用viewDidUnload

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

答案 3 :(得分:0)

这可能是一个新手的答案,所以请带上一粒盐。

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

答案 4 :(得分:0)

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