在整个视图控制器中多次调用presentViewController方法会导致iOS中的内存泄漏吗?

2024-01-17

我知道已经有很多与这个主题相关的讨论。但在所有讨论中都讨论了 2 个视图控制器 (A&B)。我的情况类似但又不同。

当有多个视图控制器(如 A、B、C、D)时会发生什么。所以呈现流程如下:

视图控制器 A(主页)呈现视图控制器 B(列表)。然后从视图控制器 B 呈现视图控制器 C(详细信息)。然后从视图控制器 C 呈现视图控制器 D(高级详细信息)。然后从视图控制器 D 呈现视图控制器 A ,以便直接导航到主页!

最好的做法是什么???


不知道你的项目结构以及如何显示 A、B、C、D、E、F 然后从 F 回到 A 的详细信息,我会大胆猜测并说这可能会导致内存泄漏,具体取决于什么您在 UIViewController 中采用的设计模式。正如@CaptJak 在您的问题中所评论的那样,很难判断它是否、如何以及何时会导致内存泄漏,特别是如果您使用委托模式在视图控制器周围传递数据。

就我个人而言,当我执行复杂的流程(例如呈现多个 UIViewController)并发现自己需要返回几个屏幕时,我不会将堆栈中的视图弹出,直到我想要的视图位于堆栈顶部(如果您使用导航)控制器),如果以模态方式呈现,则关闭视图控制器,或者如果我使用它们,则展开segues。这里的风险可能是视图控制器的内存可能已被释放。

我本来会发表评论,但我没有足够的声誉。对我的回答持保留态度,因为我对 iOS 开发还很陌生。

编辑:感谢您在应用程序流程中提供的详细信息。既然您可以使用presentViewController,我假设您正在NavigationController 上运行?如果是这样的话,我会使用popToViewController or popToRootViewController(如果 A 是您的根视图控制器)对于这种情况,而不是再次从 D 呈现 A。如果 A 再次从 D 呈现,我猜测您的 VC 堆栈中将有 2 个 A 实例,这可能会导致内存泄漏。

PopToViewController 方法

NSArray arrayOfVCs = self.navigationController.viewControllers;
for(UIViewController *currentVC in arrayOfVCs)
{
   if([currentVC isKindOfClass:[ViewControllerA class])
   {
      [self.navigation.controller popToViewController:currentVC animated:YES]
   }
}

PopToRootViewController 方法(假设 A 是导航控制器中的根视图)

[self.navigationController popToRootViewControllerAnimated:YES]

编辑 2016 年 4 月 12 日

我一直在思考这个问题,所以我实际上对此做了一个简短的 RnD,只是想在这里分享我的发现。我做了一个简单而肮脏的函数来获取我非常简单的应用程序中曾经出现过的所有模态视图控制器的堆栈。

我从 A -> B -> C-> B -> C -> B 测试了大约 20 - 30 次。每次我执行 B -> C 时,内存都会增加 0.5MB(因为我的屏幕很简单,但你的可能有所不同),最终从 20+ MB 增加到 50+ MB。

在此函数中,我记录了堆栈中呈现的视图控制器的数量以及它们在数组中的名称。到目前为止,它对我有用,但你可以尝试一下,看看它是否适合你。

//global variables
var vccount = 0
var vcnamelist = [String]()

func getPresentingViewStackCount(currentVC : UIViewController!){
       if(currentVC.presentingViewController != nil){
            vccount = vccount + 1
            let vc = currentVC.presentingViewController
            vcnamelist.append(NSStringFromClass((vc?.classForCoder)!))
            getPresentingViewStackCount(vc)
    }
}

// to use
func someRandomMethod(){
 getPresentingViewStackCount(self)
}

但仍然认为最好使用导航控制器。这就是它们的目的。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在整个视图控制器中多次调用presentViewController方法会导致iOS中的内存泄漏吗? 的相关文章

  • 如何像 youtube 一样在纸板中观看普通视频

    我有一个可以正常播放的应用程序VR视频 我的应用程序有两个玩家可以玩这两种类型 在我的VrVideoView有一个按钮可以让视频播放立体声模式 我的问题是 我怎样才能观看正常的视频Cardboard就像YouTube app None
  • 如何使用 bash 脚本通过 tar 备份文件系统?

    我想备份我的 ubuntu 文件系统 我写了这个小脚本 这是非常基本的 但这是我第一次尝试 我害怕犯错误 由于需要几个小时才能完成才能看到结果 因此我认为最好向经验丰富的程序员询问我是否做错了什么 我特别感兴趣 gt 会记录输出mv或者它也
  • Java 中的下载管理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要通过 FTP HTTP 从 Java 获取几个大文件 几个演出 有现成的库 java 命令行工具
  • Hibernate Envers:如何捕获谁删除了审计表中的实体

    我在用hibernate envers with spring 一切工作正常 除了当我删除一个实体时 它不会改变的值updated by and updated date在审计表内 它会在之后保存一个与之前完全相同的实体 仅复制 sprin
  • 内容是从 WiFi 直接传输到 Chromecast,还是从 WiFi 传输到 Android 再传输到 Chromecast?

    内容是从 WiFi 直接传输到 Chromecast 还是从 WiFi 传输到 Android 或任何其他设备 再传输到 Chromecast 我知道其他设备可用于控制 Chromecast 但我只想知道由于电池寿命的原因 您是否可以直接从
  • 真实值与预测值的降维可视化

    我有一个数据框 如下所示 label predicted F1 F2 F3 F40 major minor 2 1 4 major major 1 0 10 minor patch 4 3 23 major patch 2 1 11 min
  • 如何将 Terraform 状态从一个远程存储移动到另一个远程存储

    我们使用 Azure blob 存储作为 Terraform 远程状态 并且我尝试将有关特定现有资源的状态信息移动到该存储帐户中的不同容器 新容器 terraforminfra v2 已存在 现有 Terraform 代码指向旧容器 ter
  • 解析用户周围的位置

    您好 我开发了一个应用程序 我想问一个问题 在我的数据云解析中 我有 餐馆 类 我有三列 名称 类型字符串 imageFile 类型文件 description 类型数组和 Location 类型GeoPoint 我想知道使用哪种方法来获取
  • Eclipse:如何增加查找/替换历史记录?

    查找 替换对话框显示最后 8 个条目 该对话框通过 Ctrl F 显示 我想增加 查找 和 替换为 输入字段的历史记录中显示的条目数 我必须搜索并替换几个字符串和正则表达式 因此我一次又一次地输入字符串和正则表达式 我并不是指文件内容更改的
  • MVC ASP.NET 或 Razor

    我对 MVC 很陌生 我对 Silver light WPF 和 MVVM 有相当多的了解 但对 MVC 知之甚少 我正在按照 Microsoft 网站上的主要教程进行操作http www asp net mvc tutorials get
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • 是否有与 pdl2(或 Devel::REPL)中的 perl 调试器“x”等效的东西?

    我在用pdl2 the PDL http p3rl org PDLshell 也作为我的默认 Perl 交互式 shell 它加载所有不错的插件Devel REPL http search cpan org perldoc Devel 3a
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个
  • 如何在 Swift 中使用 substringToIndex? [复制]

    这个问题在这里已经有答案了 我在这一行收到编译器错误 UIDevice currentDevice identifierForVendor UUIDString substringToIndex 8 类型 String Index 不符合协
  • simple_fields_for 没有出现 [rails 4]

    我正在尝试创建两个隐藏字段 其中一个显示没有问题 但来自嵌套表单的另一个则没有 产品 rb class Product lt ActiveRecord Base has many product options dependent dest
  • jsf文件下载不起作用

    当我点击h commandButton它执行myBean dowanlod 方法 但它不下载任何文件 这是我在支持 bean 中的方法 没有例外 光标变得忙碌 似乎在等待响应 对于这种操作是否有任何额外的配置或者这段代码有什么问题吗
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • 如何在 Laravel 中创建一条包罗万象的路线

    我需要一个 Laravelroutes php将捕获所有流量到特定的条目example com premium section网站 以便我可以提示人们在访问优质内容之前成为会员 您还可以通过在参数上使用正则表达式来捕获 全部 Route g
  • IOError:在 Linux 上的 ReportLab 中使用 matplotlib PNG 时“解码器 zip 不可用”,适用于 Windows

    我正在使用 ReportLab 打印 matplotlib 生成的图表 我可以在我的 Windows 开发机器上毫无问题地执行此操作 然而 当我部署到 Ubuntu 服务器时 渲染失败并出现所述错误 我假设我缺少一个 Python 模块 但

随机推荐