본문 바로가기

Swift 공부

WKWebView MemoryLeak 해결

프로젝트가 웹뷰를 베이스로 진행하고있어 웹뷰를 구현을 한 후 메모리 디버깅을 해보니 웹뷰컨트롤러가 사라지지않고 계속 메모리에 남아있는 이슈를 발견하였다. 

 

해당 문제를 Coordinator 패턴을 잘못 사용하였거나 ViewModel을 잘못 사용하여 Strong 하게 메모리가 연결되어 있어 메모리가 삭제되지 않았나 라는 의심이되어 메모리를 디버깅을 해보니 해당 Coordinator , ViewModel 의 문제는 전혀 아니였고 ViewController와 Strong하게 의존되어있는 프로젝트도 발견할 수 없어 무엇이 문제인가 한참 찾아보았는데 결론이 정말 허무했다.

 

WkWebView에서 자바스크립트의 함수를 받기위한 WKScriptMessageHandler의 함수가 자체적으로 Strong하게 연결되어있어 MemoryLeak현상이 발생하는것이였습니다. 

 

해당부분을 수정하기위해

 

class LeakAvoider: 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)
    }
}

딜리게이트를 weak하게 받게 만들고 

 

 

  let webConfiguration = WKWebViewConfiguration()
  webConfiguration.userContentController.add(LeakAvoider(delegate: self), name: "키값")
      
        
  webView = WKWebView(frame: view.frame, configuration: webConfiguration)

 

이런식으로 선언을 하게되면 memory Leak 을 피할 수 있습니다.

 

 

 

 

 

잡담

 

이거 찾을려고 시간날때마다 찾아봤는데 처음에는 네비게이션 컨트롤러문제인가 아니면 self를 사용할때 weak 를 안써서 문제인가 여러 방면으로 찾아봤는데 정답은 웹뷰 자체문제... 회사내에 ios 개발자가 혼자다보니 이런 사소한 문제를 해결하는데 남들보다 많은 시간을 소요하게되지만 이것도 이거 나름대로 배우는게 많아서 참 좋다고할지 안좋다고할지 말하기 아이러니합니다.

'Swift 공부' 카테고리의 다른 글

Swift MVVM  (0) 2022.03.09
Protocol Oriented Programming(POP) - With RxSwift Mvvm  (0) 2022.02.18
타입캐스팅 is , as 와 Any , AnyObject  (0) 2021.08.05
Swift 함수형 프로그래밍  (1) 2021.08.05
Moya / RxMoya 사용해보기  (2) 2021.08.01