文档章节

WKWebView与js交互中产生的内存泄漏

o
 osc_x4h57ch8
发布于 2018/04/24 15:41
字数 472
阅读 8
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

最近开发中突然发现富文本帖子详情内存没有释放掉,找了好久问题都没找到,终于今天发现了问题,先上一点代码片段

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = [WKUserContentController new];

    [configuration.userContentController addScriptMessageHandler:self name:@"jumpWeiboPostimage"];
    
    WKPreferences *preferences = [WKPreferences new];
    preferences.javaScriptCanOpenWindowsAutomatically = NO;
    preferences.javaScriptEnabled = YES;
    configuration.preferences = preferences;
    
    WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(WebViewX, 0, self.view.width - WebViewX * 2, 1) configuration:configuration];
    webView.scrollView.bounces = NO;
    webView.scrollView.scrollEnabled = NO;
    webView.UIDelegate = self;
    webView.navigationDelegate = self;
    [self.headerView addSubview:webView];

以上片段全部调用的系统方法,看似生蓄无害其实暗藏杀机,谁也想不到竟然是这里给我搞了好多天

问题出自 addScriptMessageHandler: name: 这个方法,之一这里传入的是self即这个类的实例,以下出自自己的猜测:configuration拥有这个类实例而这个类拥有webView,webView拥有configuration从而导致循环引用,当然了大前提是configuration对这个类是强引用,如果是弱引用那就不应该出现循环引用的问题

所以第一种方法可以再推出这个页面的时候调用 removeScriptMessagehandlerForname: 手动注销添加的方法从而达到释放vc的效果。

既然在调用 addScriptMessageHandler: name: 时传入该类的实例导致释放不掉那么可以单独定义一个类从而传入这个类来过渡一下

@interface WeakScriptMessageDelegate : NSObject<WKScriptMessageHandler>

@property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate;

- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;

@end


@implementation WeakScriptMessageDelegate

- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate {
    self = [super init];
    if (self) {
        _scriptDelegate = scriptDelegate;
    }
    return self;
}

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
}

@end

此时在初始化webView注册配置时就将修改为

[configuration.userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"jumpWeiboPostimage"];

这是你会发现vc的dealloc方法会调用了,但是存在一个问题就是刚才的那个过渡类没有释放掉,此时在dealloc方法中将webView注册监听的方法移除掉即可

[self.configuration.userContentController removeScriptMessageHandlerForName:@"jumpWeiboPostimage"];

 

by:初光夫

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

java架构师成长路线-高并发网络编程的分类

鲁班学院java架构师成长路线 随着互联网时代的到来,高并发网络编程这一新鲜名词早已跃然于纸上,为了满足大众眼光的需求,我为大家找了些关于高并发网络编程方面的资料,本文便来介绍高并发...

osc_o494ayqf
9分钟前
0
0
python dict乱码如何解决

定义字典并直接输出,结果输出结果中文是乱码展示 d={'name':'lily','age':18,'sex':'女','no':1121}print d 输出结果: {'age': 18, 'no': 1121, 'name': 'lily', 'sex': '\xe5\xa5\xb3'}...

osc_9mjo6c4e
10分钟前
0
0
硬肝50天,18w字的实战编程资料《重学Java设计模式》终于 出炉了

沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 作者从5月20日那天投身实战型设计模式打磨,通过模拟互联网业务开发实际需求作为学习场景,讲解设计模式。 全书共计22个真实业务场景...

osc_zls6dx9i
12分钟前
20
0
怎么才能让Spring AOP有最大的作用--乐字节java

Spring AOP 日志处理带来的问题 我们有一个Pay(接口) 然后两个实现类DollarPay和RmbPay,都需要重写pay()方法, 这时我们需要对pay方法进行性能监控,日志的添加等等怎么做? 最容易想到的方法...

osc_sb30h1xb
14分钟前
10
0
Python 实现将numpy中的nan和inf,nan替换成对应的均值

nan:not a number inf:infinity;正无穷 numpy中的nan和inf都是float类型 t!=t 返回bool类型的数组(矩阵) np.count_nonzero() 返回的是数组中的非0元素个数;true的个数。 np.isnan() 返回b...

osc_sfl7wfr9
15分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部