iOS wkwebViewメモリの漏洩と循環参照の問題

2541 ワード

今では多くのネットワークもwkwebviewを使用していますが、以前はwkwebviewを使用していたとき、ネット上の多くの基礎チュートリアルを使用していました.Message Handlerをどのように追加するかを言っただけで、このメモリ漏洩のリスクは家に教えてくれませんでした.もしあなたが内のデータ呼び出しをしていなければ、この問題は発見されません.漏れがないという問題は大きくないと言って、小さくないと言って、深刻な話は直接その時にappが点滅して退くので、やはり重視しなければなりません.では、どのように解決するかを説明します.1、ウェブページのjsインタラクションをするとき、私たちはこのようにjsを追加します.
[self.customWebView.configuration.userContentController addScriptMessageHandler:self name:obj];

後にdellocも追加されました
- (void)dealloc {
    [_customWebView removeObserver:self forKeyPath:@"estimatedProgress"];
    [self removeScriptMessageHandler];
}

その後、ページをロードするときにpop pushが何度もメモリを操作して増加していることがわかり、高いときは200前後になっていることに気づき、このメモリの問題に気づきました.最初の解決方法は:
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    [self removeScriptMessageHandler];
}

その後、問題が依然として存在することを発見してdellocは依然として行かないで、除去方法を歩いたが、pop pushの時にホームページは元のメモリを除去していないで、後で発見します
[userContentController addScriptMessageHandler:self name:GetKeyiOSAndroid_Action];

  userContentController   self ,   
userContentController   configuration  ,
   webview  ,  webview self       ,
  self   self,                ,
     pop  dismiss          。     
    2   

1,私はselfがselfを持っていることに言及しましたが、ループリファレンスの問題を引き起こしました.私はWKWebViewConfigurationクラスを再構築しました.
[[WKWebViewConfiguration alloc]init]; 

      userContentController =[[WKUserContentController alloc]init];                          configuration.userContentController= userContentController;   

      webView = [[WKWebView alloc]initWithFrame:self.view.bounds  configuration:configuration];

selfメソッドを書き換えると2,dellocメモリが解決します.
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [_webView.configuration.userContentController addScriptMessageHandler:self name:GetKeyiOSAndroid_Action];
    [_webView.configuration.userContentController addScriptMessageHandler:self name:Upload_Action];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [_webView.configuration.userContentController removeScriptMessageHandlerForName:GetKeyiOSAndroid_Action];
    [_webView.configuration.userContentController removeScriptMessageHandlerForName:Upload_Action];

}

これはネットで見たもので、https://blog.csdn.net/wxs0124/article/details/78402596 最終的にこの問題を解決してどんな問題があって私を雑談することができて、全力を尽くしてみんなの問題を解決します
私のgithubアカウントにも注目してstar githubアドレスをクリックしてください.