iOS 添加WKWebView导致控制器无法释放的问题

Posted 简简单单,平平淡淡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 添加WKWebView导致控制器无法释放的问题相关的知识,希望对你有一定的参考价值。

在WkWebView与javascript交互中,经常会在原生中注入MessageHandler,app中注入MessageHandler的方法

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    config.userContentController = [WKUserContentController new];
    //注入handler
    [config.userContentController addScriptMessageHandler:self name:@"HandlerName"];

这里我们发现在向JS中注入handler的时候强引用了self,最终导致内存泄漏

解决方法 添加一个新类 WeakScriptMessageDelegate

@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

使用 添加了下面这行代码之后ViewController就会调用dealloc方法,此时ViewController已经正常释放。但是WeakScriptMessageDelegate没有释放,需要在dealloc中将WeakScriptMessageDelegate释放掉。

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    config.userContentController = [WKUserContentController new];
    //注入handler
    [config.userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"HandlerName"];

释放WeakScriptMessageDelegate 在dealloc方法中实现

    [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"HandlerName"];

以上是关于iOS 添加WKWebView导致控制器无法释放的问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS WKWebView - 无法添加出口,只有动作

由于 NSInvalidUnarchiveOperationException 导致 iOS11 WKWebview 崩溃

为啥我在 iOS 9 上的 WKWebView 中的音频流无法播放?

iOS 让WKWebView侧滑返回时html逐级返回

iOS 让WKWebView侧滑返回时html逐级返回

iOS 让WKWebView侧滑返回时html逐级返回