美文网首页iOS
使用WKWebView注意内存释放

使用WKWebView注意内存释放

作者: 黄春晓12 | 来源:发表于2017-12-25 11:20 被阅读0次

往WKWebView内注入JS方法时,出现内存无法释放问题

先说说wkWebView与JS交互的方法吧

WKWebViewConfiguration*config = [[WKWebViewConfigurationalloc] init];

[config.userContentController addScriptMessageHandler:selfname:@"与后台约定的方法名"];

//创建webView

WKWebView  *webView  = [[WKWebView alloc]initWithFrame:self.view.frame configuration:config];

wenView.navigationDelegate = self;

在上面的这个方法里面去创建一个webView,并且约定方法名称。

执行本地的方法时会调用以下代理方法

-(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message{

//message.body

可以打印JS端给你传过来的数据,可以根据数据去执行相应的方法

}

你以为JS调用本地的方法就完事了吗?

错误,你会发现调用方法后,内存根本不释放。也就是dealloc方法不执行。

问题就出现在

[config.userContentController addScriptMessageHandler:self name:@"与后台约定的方法名"];

这句代码上面,准确的说是“self”的身上。

那么怎么解决呢?

解决方法一

我们可以把self换掉,就是说用其他换掉self,这里面就要新建一个类

在.h里面是这样的

#import

@interfaceXLWeakScriptMessageDelegate:NSObject

@property(nonatomic,weak)id scriptDelegate;

- (instancetype)initWithDelegate:(id)scriptDelegate;

@end

在.m里面是这样的

#import "XLWeakScriptMessageDelegate.h"

@implementationXLWeakScriptMessageDelegate

- (instancetype)initWithDelegate:(id)scriptDelegate{

self= [superinit];

if(self) {

_scriptDelegate =scriptDelegate;

}

return self;

}

- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message{

[

self.scriptDelegateuserContentController:userContentControllerdidReceiveScriptMessage:message];

}

@end

新建的类我都写在这里了,大家可以拿过去直接用。

下面说的是最重要的改动,就是把

WKWebViewConfiguration*config = [[WKWebViewConfigurationalloc] init];

[config.userContentController addScriptMessageHandler:self name:@"与后台约定的方法名"];

这里面的代码改造成

WKWebViewConfiguration*config = [[WKWebViewConfigurationalloc] init];

[config.userContentController addScriptMessageHandler:[[

XLWeakScriptMessageDelegatealloc] initWithDelegate:self] name:@"callback"];

//创建webViewWKWebView*webView = [[WKWebViewalloc] initWithFrame:self.view.frameconfiguration:config];

webView.navigationDelegate = self;

这样一来,会发现内存释放了,dealloc方法会被执行了。

解决方法二、

.在当前界面显示的时候往WKWebView中注入JS,当界面消失时移除JS方法

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

[self.webView..configuration.userContentController addScriptMessageHandler:self name:@"与后台约定的方法名"];

}

- (void)viewWillDisappear:(BOOL)animated {

[super viewWillAppear:animated];

[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"与后台约定的方法名"];

}

相关文章

  • 使用WKWebView注意内存释放

    往WKWebView内注入JS方法时,出现内存无法释放问题 先说说wkWebView与JS交互的方法吧 WKWeb...

  • WKWebView内存泄漏

    WKWebView加载网页 当WKWebView与js交互时,会发生内存泄漏,造成webview无法释放。这可能造...

  • WKWebView使用记录:处理网页请求返回404、403时We

    一、WKWebView 使用WKWebView替换UIWebView可以大量减少运行内存。用法与UIWebView...

  • 内存泄漏

    内存泄漏:指无用对象(不再使用的对象)持续占用内存使内存得不到及时地释放,从而造成的内存空间的浪费。注意:内存泄漏...

  • 链接收藏

    iOS面试题 野指针 使用了释放的内存 内存泄漏 内存没有释放

  • 内存管理

    总结使用new申请内存,使用delete释放内存申请内存需要判断是否成功,释放内存需要设空指针new和delete...

  • Ubuntu日常操作手册

    lv文件系统动态扩容 手动释放内存,注意此操作会清空内存数据 关于释放内存详细描述见此文章:ubuntu 手动释放...

  • kkbox-ios-dev笔记(三) - 内存管理/代理

    内存管理(一) 内存泄漏:该释放的对象, 没有被释放(已经不再使用的对象, 没有被释放)无效内存引用:内存已经被释...

  • 内存泄漏2021-04-08

    内存泄漏注意项 一.内存泄漏概念 1.什么是内存泄漏? 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果...

  • iOS-WKWebView 初步了解

    1. 使用UIWebView加载百度页面占用内存(92.9M) 2. 使用WKWebView加载百度页面占用内存(...

网友评论

    本文标题:使用WKWebView注意内存释放

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