如何正确删除 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中的孩子?
如何使用 react redux 正确调度 axios 删除