2016-02-24 6 views
10

Я использую технику, предоставленную this SO answer предварительно загрузить некоторые URL в SFSafariViewController так:Как правильно удалить SFSafariViewController в качестве контроллера детского представления?

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

И я стараюсь, чтобы удалить контроллер Safari View с помощью следующего кода:

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

Теперь я могу предварительно загрузить URL и показать Safari View без проблем. Однако после того, как я повторю процесс (preload/show/remove) несколько раз (вероятно, 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? Я что-то упускаю? Или любое предложение по решению этой проблемы?

ответ

1

Если ваш код контроллера дочернего представления указан так, как вы указали выше, я думаю, его порядок должен быть немного иным, как в документации.

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

Вы должны сначала добавить дочерний вид, а затем вызвать didMoveToParentViewController. Попробуйте это и посмотрите, работает ли это.

Листинг 5-1Adding контроллер вида ребенка в контейнер

  • (пустоты) displayContentController: (UIViewController *) Содержание {[самостоятельной addChildViewController: Содержание]; content.view.frame = [self frameForContentController]; [self.view addSubview: self.currentClientView]; [контент сделалMoveToParentViewController: self]; }

В предыдущем примере, обратите внимание, что вы называете только didMoveToParentViewController: метод ребенка. Это связано с тем, что метод addChildViewController: вызывает метод дочернего метода willMoveToParentViewController: для вас. Причина, по которой вы должна вызвать метод didMoveToParentViewController: сам метод , метод не может быть вызван до тех пор, пока вы не введете вид ребенка в иерархию представления вашего контейнера.

+0

пытался заказ предложил, но все та же проблема остается. –

+0

Могли бы вы использовать WKWebkitView и добавить его в качестве подчиненного в ваш основной VC вместо использования SVC? –

+1

нет, используя WKWebkitView - это другое дело –

1

Возможно, вы, вероятно, просачиваетесь svc. nil его после удаления.

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

если это не решить, попробуйте включить зомби или использовать инструмент утечки