본문 바로가기

IT/iOs

Webkit 메모리 누수 문제 해결법

 

 

WKScriptMessageHandler 사용 시에 add함수 자체에 문제가 있게 설계가 됐습니다.

스택오버플로우에서 찾은 방법으로 적용하니 바로 해결이 되는군요 

 

애플의 예제코드도 그렇고 다른 예제들을 보면 addScriptMessageHandler 에 delegate를 설정할때 그냥 self를 셋합니다.

일단 복붙하여 테스트를 해보고 동작하면 넘어가고 메모리 누수를 맞이합니다.

핸들러는 델리게이트를 참조하고 웹뷰는 핸들러를 소유하면서 순환참조가 발생합니다.

 

하기 코드는 스크립트 핸들러로 인한 메모리 누수를 막기위한 코드입니다.

 

swift, objective-c 각각 적어놓겠습니다.

 

swift 버전

class LeakAvoider : NSObject, WKScriptMessageHandler {
    weak var delegate : WKScriptMessageHandler?
    init(delegate:WKScriptMessageHandler) {
        self.delegate = delegate
        super.init()
    }
    func userContentController(userContentController: WKUserContentController,
        didReceiveScriptMessage message: WKScriptMessage) {
            self.delegate?.userContentController(
                userContentController, didReceiveScriptMessage: message)
    }
}
self.wv.configuration.userContentController.addScriptMessageHandler(
    LeakAvoider(delegate:self), name: "dummy")

 

objective-c 버전

@interface WeakScriptMessageDelegate : NSObject<WKScriptMessageHandler>

@property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate;

- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;

@end

@implementation WeakScriptMessageDelegate

- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate
{
    self = [super init];
    if (self) {
        _scriptDelegate = scriptDelegate;
    }
    return self;
}

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
}

@end
WKUserContentController *userContentController = [[WKUserContentController alloc] init];    
[userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"name"];

 

 

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

 

WKWebView causes my view controller to leak

My view controller displays a WKWebView. I installed a message handler, a cool Web Kit feature that allows my code to be notified from inside the web page: override func viewDidAppear(animated: Bo...

stackoverflow.com