WKWebView 与js交互不释放问题

在使用WKWebView和js交互时,会发现不走dealoc方法,也就是没有释放。经查,问题出现在注册方法那行代码,eg:

[config.userContentController addScriptMessageHandler:self name:@"close"];

config是生成WKWebView需要的配置类WKWebViewConfiguration,它注册方法是会对self引用,而我是吧WkWebView作为一个属性,这样就发生了循环引用,

界面办法发是生成一个代理类,名字为:WeakScriptMessageDelegate

WeakScriptMessageDelegate.h

#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>
@interface WeakScriptMessageDelegate : NSObject<WKScriptMessageHandler>

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

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

@end

WeakScriptMessageDelegate.m

#import "WeakScriptMessageDelegate.h"

@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

将代码

[config.userContentController addScriptMessageHandler:self name:@"close"];

改成

[config.userContentController addScriptMessageHandler:[[JFTWeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"close"];

即可。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,144评论 1 32
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,612评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,967评论 19 139
  • 前言 给大家介绍另外一种基于 iOS 8 新推出的 WKWebView 组件,构建出自己的混合开发框架。 WKWe...
    iwolfox阅读 1,142评论 1 3
  • 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...
    夏臻Rock阅读 6,482评论 0 0