카테고리 없음
WKWebView를 사용하면서 발생하는 Memory Leaks 해결법
ragdoll-cat
2025. 2. 18. 16:41
🔴 오류
WKWebView를 사용한 객체가 메모리에서 해제되지 않고 남아 Memory Leaks 발생
🔍 원인
WKUserContentController가 WKScriptMessageHandler를 강하게 참조(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) 또는 자동 해제 방식으로 동작함.