view controller가 메모리에서 계속 사라지지가 않아서 열심히 찾아보다가 delegate 문제인줄 알았는데 wkwebview 문제였어서..ㅠㅠ
삽질한 김에 다른 분들은 wkwebview를 사용할때 삽질하지 않으셨으면 해서 작성하게 되었습니다.
(나만 몰랐던 것 같기도 하고..)
웹과 앱의 소통을 위해서 wkwebview에 message handler를 설정합니다.
let webConfiguration = WKWebViewConfiguration()
let contentController = WKUserContentController()
contentController.add(self, name: "message")
webConfiguration.userContentController = contentController
let webView = WKWebView(frame: self.view.frame, configuration: webConfiguration)
이렇게 등록한 뒤 웹에서 적절하게 호출해주면
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
// code..
}
해당 함수가 불리게 되고, 가져온 메세지로 알맞게 로직을 구성하게 됩니다.
여기서 메모리 릭이 발생하는 부분은 message handler를 설정해주는 부분입니다.
contentController.add(self, name: "message")
네.. 여기서 순환참조가 발생합니다.
밑에 소개하는 게시물에서도 언급하지만 저도 self를 당연히 weak으로 넘겨주겠거니 생각해서 확인할 생각을 하지 못했습니다. ;.;
저는 처음에
wkwebview message handler memory leak(쉽게 실수하는 WKWebView 메모리 누수 수정)
해당 게시물을 참고했었습니다. 위 방법도 좋아보이긴 하는데 저는 다른 방법도 소개해드리려고 합니다.
webview.configuration.userContentController.removeScriptMessageHandler(forName: "message")
조금 더 간단해졌죠?
view controller가 disappear 되는 시점이나 webview가 필요없어지는 시점에 사용하면 되겠습니다.
(프로젝트 타겟이 iOS 14이상이면 removeAllScriptMessageHandlers()
도 사용하실수 있습니다~)
감사합니다~ 덕분에 쉽게 해결하는 방법을 찾았습니다. ^^