美文网首页
使用WKWebView 控制器不走dealloc解决方法

使用WKWebView 控制器不走dealloc解决方法

作者: 相敬如冰 | 来源:发表于2019-01-21 18:36 被阅读56次

    WKWebView在iOS开发中常用,相对于以前的UIWebView的弊病(内存泄漏)而言,深受喜爱!

    主要是观察了webview的 title(标题)和estimatedProgress(加载进度)  和 webView的scrollView的contentSize(内容尺寸,方便知道高度)

    具体代码如下

    [self.webViewaddObserverBlockForKeyPath:LMJKeyPath(self.webView,title)block:^(id  _Nonnullobj,id  _NullableoldVal,id  _NullablenewVal) {

                if(!LMJIsEmpty(newVal) && [newValisKindOfClass:[NSStringclass]] && [selfwebViewController:selfwebViewIsNeedAutoTitle:self.webView]) {

                    NSLog(@"标题是%@",newVal);

                }

            }];

       [self.webViewaddObserverBlockForKeyPath:LMJKeyPath(weakself.webView,estimatedProgress)block:^(id  _Nonnullobj,id  _NullableoldVal,id  _NullablenewVal) {

            weakself.progressView.progress= weakself.webView.estimatedProgress;

            // 加载完成

            if(weakself.webView.estimatedProgress  >=1.0f) {

                [UIView animateWithDuration:0.25f animations:^{

                    weakself.progressView.alpha=0.0f;

                    weakself.progressView.progress=0.0f;

                }];

            }else{

                weakself.progressView.alpha=1.0f;

            }

        }];

       [self.webView.scrollViewaddObserverBlockForKeyPath:LMJKeyPath(self.webView.scrollView,contentSize)block:^(id  _Nonnullobj,id  _NullableoldVal,id  _NullablenewVal) {

            [weakselfwebView:weakself.webViewscrollView:weakself.webView.scrollViewcontentSize:weakself.webView.scrollView.contentSize];

        }];


    今天才注意到 ViewController 没有走dealloc方法,仔细一看,原来的写法是把 移除 观察者 放在了dealloc 里面,这么一想,就能知道问题在哪了!

    原先的想法是 控制器 释放了,之后就 把 观察者移除!然而现在的问题是因为未移除,导致控制器不会被释放,自然想到了鸡和蛋的哲学问题,哈哈

    之后就很容易想到在 viewDidDisappear 方法里 移除观察者

    [_webView.scrollView removeObserverBlocks];

    [_webView removeObserverBlocks];


    重新运行跑起来,发现还是未如愿,就找到了上面的简友的文章 地址

    因为我们项目有交互,wk自带的使用起来又极其方便 js调本地方法如下

    1.遵守代理 WKScriptMessageHandler

    2. 注册 [config.userContentController addScriptMessageHandler:self name:@"XXX"];

    3.实现 - (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message ;

    所以类似于观察者,添加了一定要移除  所以就有了 removeScriptMessageHandlerForName 同样可以在 viewDidDisappear 方法里添上

    [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"XXX"];


    再来一次,重新运行,走了dealloc方法!

    相关文章

      网友评论

          本文标题:使用WKWebView 控制器不走dealloc解决方法

          本文链接:https://www.haomeiwen.com/subject/uxhhjqtx.html