카테고리 없음

WKWebView를 사용하면서 발생하는 Memory Leaks 해결법

ragdoll-cat 2025. 2. 18. 16:41

🔴 오류

WKWebView를 사용한 객체가 메모리에서 해제되지 않고 남아 Memory Leaks 발생

 

🔍 원인

WKUserContentControllerWKScriptMessageHandler를 강하게 참조(strong reference)하기 때문

 

🛠 해결 방법

1. WKScriptMessageHandler를 핸들러에서 제거한다.

 

- UIKit

override func viewDidDisappear(_ animated: Bool) {
  ...
  popupWebView = nil
  contentController.removeScriptMessageHandler(forName: "handler")
}

 

viewDidDisappear에서 removeScriptMessageHandler 메서드 호출

 

- SwiftUI

class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler {
  ...
  func removeScriptHandler(from webView: WKWebView) {
    webView.configuration.userContentController.removeScriptMessageHandler(forName: "handler")
  }
}
...
static func dismantleUIView(_ uiView: WKWebView, coordinator: Coordinator) {
  coordinator.removeScriptHandler(from: uiView)
}

 

dismantleUIView 함수에서 removeScriptMessageHandler 메서드 호출

 

dismantleUIView(_:coordinator:)

observer를 제거하는 등 clean-up 관련 작업을 여기서 하면 된다고 한다.


2. WKScriptMessageHandler 대신 WKScriptMessageHandlerWithReply를 사용한다.(iOS 14+)

  • WKScriptMessageHandlerWithReply는 JavaScript에서 응답을 받을 때까지 객체를 유지하지만, 이후에는 자동으로 해제됨
  • WKScriptMessageHandlerWithReply를 사용하면 removeScriptMessageHandler(forName:)을 호출하지 않아도 핸들러가 자동으로 해제됨

WKScriptMessageHandlerWithReply는 기존 WKScriptMessageHandler처럼 강한 참조를 유지하지 않고, 약한 참조(Weak Reference) 또는 자동 해제 방식으로 동작함.