每次新创建动态图都需要点击新建按钮吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每次新创建动态图都需要点击新建按钮吗相关的知识,希望对你有一定的参考价值。

参考技术A 需要。每次新创建动态图都需要点击新建按钮,每次录制保存一个后必须新建,否则会和前面的录制内容连在一起。创建动态图可以使用FacePicAPP来制作动态照片。

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

【中文标题】每次我想推送它时都应该创建一个 UIViewController 吗?【英文标题】:Should I create an UIViewController every time I want to push it? 【发布时间】:2012-07-07 17:10:15 【问题描述】:

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

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

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

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

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

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

提前谢谢你。

编辑:我正在使用 ARC

【问题讨论】:

通常你应该按需创建控制器,而不是预先创建控制器。无需浪费宝贵的内存。 【参考方案1】:

你说:

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

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

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

【讨论】:

分析仪没有警告:( 另外,顺便说一下,仅仅因为你弹出了一个视图,这取决于你正在做的事情,iOS 可能会在后台做一些巧妙的缓存。 (例如UIImageimageNamed)可能不会释放所有内容。所以如果你没有回到你开始的地方,不要太痛苦。只需确保您的应用没有泄漏即可。 似乎有 2 处泄漏(malloc 48 字节,libsystem_c.dylib)。我认为它与我的代码无关......问题是在使用该应用程序密集播放 2 或 3 分钟后,它很容易达到 15 或 20 MB,并收到内存警告。我在 every VC 中将 viewDidUnload 中的所有属性设置为零,所以我不知道我还能做什么...... @sonxurxo 我怀疑这无关,但你应该看看你在viewDidUnloaddealloc 中清除的内容。前者在didReceiveMemoryWarning 情况后调用。所以我通常将我的IBOutlets 置零(如果我正在缓存,我的缓存也是如此),但我在dealloc 中进行了大部分非 IBOutlet ivar/property 清理。此外,iOS 6 测试版笔记有一些有趣的 cmets reviewDidUnload,您可能想看看(但我们无法公开讨论)。 你会进入这个聊天室 (chat.***.com/rooms/13561/…) 并在那里讨论吗? TIA【参考方案2】:

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

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

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

【讨论】:

我认为我没有任何保留周期(至少,我的“第二个”VC 没有保留对第一个的任何引用)。但是,为什么内存使用量只会增加,而不是从 1.1MB -> 1.5MB -> 1.1MB -> 1.5MB ->.... 当我 push->pop->push->流行......我的第二个VC? 它不仅会增长...在这里你展示了一个场景,当弹出这里时内存正确减少。这与您在“已用内存不减少”的问题中描述的不同。那么它是哪一个? 场景是:当我推送一个 VC 时,Live 字节增长。当我按下返回按钮(弹出)时,Live Bytes 或多或少保持不变。当我再次推动时,它会再次增长。当我再次弹出时,它仍然存在。所以它一直在增长 那我不明白你的1.1 -> 1.5 -> 1.1 -> 1.5的问题 这是我所期望的行为,但事实并非如此(也许我没有清楚地解释自己,对此感到抱歉)【参考方案3】:

一般来说,UIViewController 对内存的占用应该相当少。 UIView 对象可以节省最多的内存,方法是确保您熟悉视图生命周期并让视图得到清理(通过不在视图控制器的 @987654324 之外的任何地方保留对它们的引用@property 并通过在viewDidUnload 中设置对nil 的任何其他视图引用)。有一个good answer here关于如何使用viewDidUnload

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

仅供参考,虽然我也喜欢故事板,但如果您需要支持 iOS 5 之前的版本,则无法使用它们。 是的@RobertRyan,这就是我不能使用它们的原因 好的。我明白。我对故事板的偏爱源于我对 iOS 编程的陌生。老实说,我不知道没有它我会做什么!【参考方案5】:

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

【讨论】:

因为我在回答中告诉过你,所以你真的应该将我标记为正确。

以上是关于每次新创建动态图都需要点击新建按钮吗的主要内容,如果未能解决你的问题,请参考以下文章

如何找到动态创建的 li 的宽度 [重复]

我们可以动态添加文本字段吗

用户控件,动态创建添加用户控件

如何创建自己电脑开机动态密码

怎么用PS做出gif动态图,求详细教程

需要在按钮单击时隐藏/取消隐藏动态创建的下拉列表