iOSWKWebView注册方法导致内存得不到释放问题

我们在使用WKWebView的时候,需要与h5那边进行交互,比如:h5那边有个按钮点击,iOS端需要监听这个方法并作出相应的逻辑处理,这时候我们就需要通过注册方法来进行交互,如下

[self.userContentController addScriptMessageHandler:self name:MethodName];

但我们退出该控制器的时候,就会发现dealloc方法根本不会调用,导致内存得不到释放,这时候我们就要通过中间变量LAWKDelegateController来注册方法,解决内存释放问题

- (void)viewDidLoad {
    [super viewDidLoad];
    //配置环境
    WKWebViewConfiguration * configuration = [[WKWebViewConfiguration alloc]init];
    self.userContentController = [[WKUserContentController alloc]init];
    configuration.userContentController = self.userContentController;
    
    self.webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, 100, 100) configuration:configuration];
//    self.webView.UIDelegate = self;
//    self.webView.navigationDelegate = self;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
    [self.view addSubview:self.webView];
    /**
     注册方法
     addScriptMessageHandler:self
     当我们通过self注册方法的时候,发现dealloc不会调用,内存得不到释放
     解决方法:
     通过中间变量解决内存释放问题:LAWKDelegateController
     */
//    [self.userContentController addScriptMessageHandler:self name:MethodName];
    LAWKDelegateController *delegateController = [[LAWKDelegateController alloc]init];
    delegateController.delegate = self;
    [self.userContentController addScriptMessageHandler:delegateController  name:MethodName];
}
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>

NS_ASSUME_NONNULL_BEGIN

@protocol WKDelegate <NSObject>

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

@end
@interface LAWKDelegateController : UIViewController <WKScriptMessageHandler>

@property (weak , nonatomic) id<WKDelegate> delegate;

@end

NS_ASSUME_NONNULL_END
#import "LAWKDelegateController.h"

@interface LAWKDelegateController ()

@end

@implementation LAWKDelegateController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    if ([self.delegate respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]) {
        [self.delegate userContentController:userContentController didReceiveScriptMessage:message];
    }
}

@end

代码在此

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容