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

时间:2016-02-24 09:41:41

标签: ios swift childviewcontroller sfsafariviewcontroller

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

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

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

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 View控制器时,我是否正确执行此操作?我错过了什么吗?或者有任何解决这个问题的建议吗?

2 个答案:

答案 0 :(得分:1)

如果您添加的子视图控制器代码与上面指定的相同,那么我认为其顺序应该与文档略有不同。

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

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

  

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

     
      
  • (void)displayContentController:(UIViewController *)content {[self addChildViewController:content]; content.view.frame = [self   frameForContentController]; [self.view   addSubview:self.currentClientView]; [内容   didMoveToParentViewController:自]; }
  •   
     

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

答案 1 :(得分:1)

你可能正在泄漏svc。删除它后就把它弄掉了。

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

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