버그 잡이

WKWebview 메모리 릭 이슈 해결 본문

IOS

WKWebview 메모리 릭 이슈 해결

버그잡이 2022. 8. 7. 16:11

 

문제 상황

  • WKWebview의 userContentController에 .add()를 통해서 웹페이지와의 인터페이스를 연결하는데 이때 들어가는 self로 인해 순환참조가 발생한다.
webView.configuration.userContentController.add(self, name: "something")

 

해결 방법

  • self를 직접 넣는 것이 문제이니, self를 약하게 가지고 있는 객체를 만들어서 대신 넣어준다. (그 결과 순환 참조가 일어나지 않는다)
webView.configuration.userContentController.add(WKWebViewLeakAvoider(delegate: self), name: interface.rawValue)
class WKWebViewLeakAvoider : NSObject, WKScriptMessageHandler {
    weak var delegate : WKScriptMessageHandler?
    init(delegate:WKScriptMessageHandler) {
        self.delegate = delegate
        super.init()
    }
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        self.delegate?.userContentController(userContentController, didReceive: message)
    }
}

LeakAvoider의 원리는 간단합니다. 순환 참조가 일어나지 않게 LeakAvoider가 대신 self를 들고 있는 것입니다.

그와 동시에 self.delegate?.userContentController()를 통해서 기존 웹뷰에 있는 로직이 그대로 실행되게 해줍니다.

 

 

 

참고

 

https://stackoverflow.com/questions/26383031/wkwebview-causes-my-view-controller-to-leak

 

 

반응형
Comments