在使用WKWebView和js交互時(shí),會(huì)發(fā)現(xiàn)不走dealoc方法,也就是沒有釋放。經(jīng)查,問(wèn)題出現(xiàn)在注冊(cè)方法那行代碼,eg:
[config.userContentController addScriptMessageHandler:self name:@"close"];
config是生成WKWebView需要的配置類WKWebViewConfiguration,它注冊(cè)方法是會(huì)對(duì)self引用,而我是吧WkWebView作為一個(gè)屬性,這樣就發(fā)生了循環(huán)引用,
界面辦法發(fā)是生成一個(gè)代理類,名字為: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"];
即可。