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方法!
网友评论