WKWebViewを使用する場合、ViewControllerはdeallocメソッドのレコードを呼び出さない
2052 ワード
WKWebViewを使用する場合、ViewControllerはdeallocメソッドのレコードを呼び出さない
現在のプロジェクトでは、H 5ページが多く埋め込まれているので、H 5ページを完全に表示するためにControllerをカプセル化することを考慮します.現在のプロジェクトによるiOSバージョンのサポートはiOS 8.0より上なので、
通常は
そしてH 5ページをロードし、すべてが正常に見えますが、何度もテストした結果、対応する
最後にJSインタラクションオブジェクトが登録されているかどうかを推測すると,オブジェクト自体
だからページを閉じる
最後に、ページを閉じた後に
現在のプロジェクトでは、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インタラクションオブジェクトが登録されているかどうかを推測すると,オブジェクト自体
self
がMessageHandler
に伝達されることになる.後でいくつかの資料を調べたところ、AppleのdevelopmentでJSインタラクションオブジェクトremoveScriptMessageHandlerForName
を削除する必要があることが明らかになった.だからページを閉じる
WKWebView
のController
の時、JSインタラクティブオブジェクトを除去しますWKUserContentController *controller = self.contentWKWebView.configuration.userContentController;
[controller removeScriptMessageHandlerForName:@"vhswebview"];
最後に、ページを閉じた後に
- (void)dealloc
を呼び出すことができます.