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

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解决方法)