WKWebViewを使用する場合、ViewControllerはdeallocメソッドのレコードを呼び出さない

2052 ワード

WKWebViewを使用する場合、ViewControllerはdeallocメソッドのレコードを呼び出さない
現在のプロジェクトでは、H 5ページが多く埋め込まれているので、H 5ページを完全に表示するためにControllerをカプセル化することを考慮します.現在のプロジェクトによるiOSバージョンのサポートはiOS 8.0より上なので、WKWebViewを選択します.
通常はViewDidLoadで初期化され、WKWebViewが設定されています.
- (void)setupWKWebView {
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    WKUserContentController *controller = [[WKUserContentController alloc] init];
    configuration.userContentController = controller;
    self.contentWKWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 64, SCREENW, SCREENH - NAVIAGTION_HEIGHT)
                                           configuration:configuration];
    self.contentWKWebView.UIDelegate = self;
    self.contentWKWebView.navigationDelegate = self;
    self.contentWKWebView.allowsBackForwardNavigationGestures = YES;
    //      
    [self.contentWKWebView addObserver:self
                        forKeyPath:@"estimatedProgress"
                           options:NSKeyValueObservingOptionNew context:nil];
    
    //   JS    
    WKUserContentController *controller = self.contentWKWebView.configuration.userContentController;
    [controller addScriptMessageHandler:self name:@"vhswebview"];
}

そしてH 5ページをロードし、すべてが正常に見えますが、何度もテストした結果、対応する- (void)dealloc;が一度も呼び出されていないことがわかり、メモリ漏れが必然的に発生しました.このControllerコードをチェックすると、blockのループリファレンス、エージェントなどの場所に問題はありません.
最後にJSインタラクションオブジェクトが登録されているかどうかを推測すると,オブジェクト自体selfMessageHandlerに伝達されることになる.後でいくつかの資料を調べたところ、AppleのdevelopmentでJSインタラクションオブジェクトremoveScriptMessageHandlerForNameを削除する必要があることが明らかになった.
だからページを閉じるWKWebViewControllerの時、JSインタラクティブオブジェクトを除去します
WKUserContentController *controller = self.contentWKWebView.configuration.userContentController;
[controller removeScriptMessageHandlerForName:@"vhswebview"];

最後に、ページを閉じた後に- (void)deallocを呼び出すことができます.