presentModalViewController 是 pushviewcontroller 内存消耗

Posted

技术标签:

【中文标题】presentModalViewController 是 pushviewcontroller 内存消耗【英文标题】:presentModalViewController vs pushviewcontroller memory cosumption 【发布时间】:2016-09-20 06:19:49 【问题描述】:

我有两种方法可以从一个视图控制器跳转到另一个视图控制器

对于presentViewController

  [self presentModalViewController:view animated:YES];

对于 pushViewControlle 应该使用

[self.navigationController pushViewController:view animated:YES];

哪种方法最好?

哪个会导致更多的内存泄漏?

如果我们的设计是这样的,使用哪一个

Introduction view (bunch of slides )-> login -> signUp-> HomeActivityScreen-> Then Bunch of tab bar in it

【问题讨论】:

HomeActivityScreen 包含什么? 如果它包含一个标签栏或只是一个简单的视图或一个表格视图,对于所有情况,它都是一个普遍的问题 查看我之前的回答,或许对你有帮助:***.com/questions/39159444/… 【参考方案1】:

如果您使用 pushViewController,您将在导航栏中自动获得一个“返回”按钮。如果您使用 presentModalViewController 则不需要,并且通常必须实现您自己的控件和/或回调来处理关闭控制器。

从概念上讲,模态演示样式通常用于您无法离开的原子任务(即,您要么完成任务,要么取消,并且在您执行其中一项之前,您无法在应用程序中执行任何其他操作)。

如果您想知道为什么首先会有差异,我不能说。就我个人而言,我认为为从一个控制器移动到另一个控制器(如 cocos2d 或 android)提供统一 API 的框架更有意义。

您使用模态视图控制器将用户的注意力集中在任务上。当您推送时,用户处于某种导航流程中,但仍然触手可及整个应用程序。他们可能会决定前进或后退,切换到中间的不同选项卡,无论如何。当他们获得模态视图控制器时,他们无法执行任何操作,直到任务完成或取消(模态视图被解除)

当您呈现模态视图控制器时,系统会在执行呈现的视图控制器和被呈现的视图控制器之间创建父子关系。具体来说,执行呈现的视图控制器更新其 modalViewController 属性以指向其呈现的(子)视图控制器。同样,呈现的视图控制器更新其 parentViewController 属性以指向呈现它的视图控制器。

模态视图控制器提供了有趣的方法来管理应用程序的流程。最常见的是,应用程序使用模态视图控制器作为临时中断,以便从用户那里获取关键信息。但是,您也可以使用模态呈现的视图控制器在特定时间为您的应用程序实现替代接口。

所以,据我了解,这是最好的选择。

[self.navigationController pushViewController:view animated:YES];

【讨论】:

【参考方案2】:

Apple 通过Automatic Reference Counting 处理这两个内存。尽管推送视图控制器可能需要比呈现视图控制器更多的内存,但在弹出或关闭ViewController 时会释放分配的内存。如果在弹出的ViewController 中没有进行强引用,ARC 会释放所述内存,或者换句话说,ReferenceCount 为 0。因此必须注意不要保留对 ViewContoller 的强引用对象。

现在是展示还是推送ViewController 完全取决于您的应用设计。阅读this,了解何时提交ViewController,.

【讨论】:

【参考方案3】:

它们是从一个视图控制器导航到另一个视图控制器的两种方法。

默认情况下: - pushviewcontroller:您将有一个返回按钮返回到上次访问的页面。您的视图控制器放在导航堆栈的顶部。在页面之间导航时像网页一样思考。 - presentmodalviewcontroller:你没有什么可以回到上次访问的页面。它通常用于:弹出或切换到新的导航分支。

pushviewcontroller & presentmodalviewcontroller 的使用不会产生内存泄漏。

对于您的应用程序流程,我认为 HomeActivitiesScreen 是您的“标签栏”中的视图控制器之一。如果是这样,请创建一个包含该选项卡栏的视图控制器,并将其作为应用程序的根目录(例如,命名为 RootViewController)。那么:

应用程序启动时,您会显示 RootViewController 立即将模态视图呈现给您的“介绍页面”,然后登录/注册。此模式视图以导航视图控制器结构开始。 当用户连接时,关闭您的模态视图,返回您的 HomeActivitiesScreen 并在需要时刷新包含。

这样,您不需要在不需要时保留对登录/注册屏幕的引用。

【讨论】:

以上是关于presentModalViewController 是 pushviewcontroller 内存消耗的主要内容,如果未能解决你的问题,请参考以下文章