如何正确删除 SFSafariViewController 作为子视图控制器?

Posted

技术标签:

【中文标题】如何正确删除 SFSafariViewController 作为子视图控制器?【英文标题】:How to remove SFSafariViewController as a child view controller correctly? 【发布时间】:2016-02-24 09:41:40 【问题描述】:

我正在使用this SO answer 提供的技术在 SFSafariViewController 中预加载一些 URL,如下所示:

addChildViewController(svc)
svc.didMoveToParentViewController(self)
view.addSubview(svc.view)

我尝试使用以下代码删除 Safari 视图控制器:

svc.willMoveToParentViewController(nil)
svc.view.removeFromSuperview()
svc.removeFromParentViewController()

现在我可以毫无问题地预加载 URL 并显示 Safari 视图。但是,在我重复该过程(预加载/显示/删除)几次(可能超过 30 次)后,应用程序将由于一些内存问题而崩溃,因为当应用程序崩溃时日志显示Memory level is not normal or this app was killed by jetsam

在崩溃之前,我看到了一些关于可能泄漏警告的日志:

<Warning>: notify name "UIKeyboardSpringBoardKeyboardShow" has been registered 20 times - this may be a leak

<Warning>: notify name "com.apple.SafariViewService-com.apple.uikit.viewService.connectionRequest" has been registered 20 times - this may be a leak

删除 Safari 视图控制器时我是否正确执行此操作?我错过了什么吗?或者有什么解决这个问题的建议?

【问题讨论】:

【参考方案1】:

如果您添加的子视图控制器代码如您在上面指定的那样,那么我认为它的顺序应该根据文档有所不同。

addChildViewController(svc)
view.addSubview(svc.view)
svc.didMoveToParentViewController(self)

您应该先添加子视图,然后调用 didMoveToParentViewController。试试这个,看看它是否有效。

清单 5-1 将子视图控制器添加到容器中

(void) displayContentController: (UIViewController*) content [self addChildViewController:content]; content.view.frame = [自我 框架内容控制器]; [自我.view addSubview:self.currentClientView]; [内容 didMoveToParentViewController:self];

在前面的示例中,请注意您只调用 didMoveToParentViewController:子方法。那是因为 addChildViewController: 方法调用孩子的 willMoveToParentViewController: 适合你的方法。 你的原因 必须自己调用 didMoveToParentViewController: 方法是 在嵌入孩子的视图之前无法调用该方法 进入容器的视图层次结构。

【讨论】:

尝试了建议的顺序,但仍然存在同样的问题。 您能使用 WKWebkitView 并将其作为子视图添加到您的主 VC 中而不是使用 SVC 吗? 您能否将整个代码发送给我进行测试或演示此问题的示例原型?【参考方案2】:

您可能正在泄漏svc。删除后将其归零。

svc.willMoveToParentViewController(nil)
svc.view.removeFromSuperview()
svc.removeFromParentViewController()
svc = nil

如果这不能解决问题,请尝试启用僵尸或使用泄漏工具

【讨论】:

以上是关于如何正确删除 SFSafariViewController 作为子视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate如何正确删除@OneToMany中的孩子?

Oracle如何正确删除archivelog文件

如何使用 react redux 正确调度 axios 删除

如何从 QT 项目中正确删除 QML 文件

如何从 UICollectionView 中正确删除单元格?

如何正确添加和删除 MIME 附件