iOS开发---WKWebView导致Controller不调用dealloc

前言

本文主要解决WKWebView在通过WKUserContentController添MessageHandler方法用于JS调用Native导致ViewController内存泄露,无法正常释放。

ViewController没有调用dealloc可能的原因

在调用WKWebView时,ViewController没有调用- (void)dealloc方法。之后检查了ViewController中所有使用到self的地方,发现WKUserContentController的下面这个方法有使用到self关键字

-(void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = [[WKUserContentController alloc] init];
[config.userContentController addScriptMessageHandler:self name:@"finishMethod"];

所以Google了一下搜到的结果该方法,确实是由于该方法引起ViewController内存泄漏。

解决方案
WeakScriptMessageDelegate
@interface WebJsDelegate:NSObject <WKScriptMessageHandler>

@property(nonatomic,weak)id<WKScriptMessageHandler> target;
- (instancetype)initWithScriptTarget:(id<WKScriptMessageHandler>)target;

@end
@implementation WebJsDelegate

- (instancetype)initWithScriptTarget:(id<WKScriptMessageHandler>)target{
    if(self=[super init]){
        self.target = target;
    }
    return self;
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    if([self.target respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]){
        [self.target userContentController:userContentController didReceiveScriptMessage:message];
    }
}

@end
调用
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = [[WKUserContentController alloc] init];
[config.userContentController addScriptMessageHandler:[[WebJsDelegate alloc]initWithScriptTarget:self] name:@"finishMethod"];
- (void)dealloc {
    [self.config.userContentController removeScriptMessageHandlerForName:@"finishMethod"];
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值