zoukankan      html  css  js  c++  java
  • 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"];
    
    
  • 相关阅读:
    驴的故事
    leetcode125. Valid Palindrome
    C#处理Excel的帮助类
    用SVN进行团队开发协作生命周期详解
    .net反编译原理
    科学使用Log4View2查看日志
    NLog日志框架使用探究-2
    NLog日志框架使用探究-1
    从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)
    十分钟学会 Markdown 基本语法
  • 原文地址:https://www.cnblogs.com/qqcc1388/p/8487052.html
Copyright © 2011-2022 走看看