11

我正在使用此 SO 答案提供的技术在 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 视图控制器时我是否正确执行此操作?我错过了什么吗?或者有什么建议可以解决这个问题?

4

2 回答 2

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:self]; }

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

于 2016-02-29T10:09:17.427 回答
1

你可能在泄漏svc。删除后将其消除。

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

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

于 2016-03-03T09:23:43.860 回答