wkwebview 的内存泄漏问题

43 篇文章 1 订阅

昨天写好的一个功能是有关wkwebview的。本身根据我的理解,wkwebview相比于uiwebview来说有了很好的优化,具体的好处这里我就不说了,我说一下我这里遇到的问题。
我们的项目中要用到JS调用OC和OC调用JS,
这里要用到 WKUserContentController

WKWebViewConfiguration * configura = [[WKWebViewConfiguration alloc] init];
    WKUserContentController * userCont = [[WKUserContentController alloc] init];
    configura.userContentController = userCont;

使用WKUserContentController时要注意有一个内存崩溃的情况,要记得及时把添加的JS的方法名移除。@"openUrl"类似于这样,全是跟H5商量好的方法名
代码如下

- (void)AddJSInvokingOCFunctionList:(WKWebView *)wkweb viewController:(UIViewController<WKScriptMessageHandler> *)viewController{
    [wkweb.configuration.userContentController addScriptMessageHandler:viewController name:@"jsToOc"];
    [wkweb.configuration.userContentController addScriptMessageHandler:viewController name:@"openUrl"];
    [wkweb.configuration.userContentController addScriptMessageHandler:viewController name:@"callFunction"];
    [wkweb.configuration.userContentController addScriptMessageHandler:viewController name:@"xlShopShareToPY"];
}

添加之后记得移除

- (void)removewJSInvokingOCFunctionList:(WKWebView *)wkweb{
    [wkweb.configuration.userContentController removeScriptMessageHandlerForName:@"jsToOc"];
    [wkweb.configuration.userContentController removeScriptMessageHandlerForName:@"openUrl"];
    [wkweb.configuration.userContentController removeScriptMessageHandlerForName:@"xlShopShareToPY"];
 
}

我的webview是写在viewcontroller里面的,那么这里如何判断是否还存在内存泄漏呢,除了使用podfiles进行动态内存分析之外,还可以根据是否执行了delloc方法来判断。经过push和present得到的controller,在back回来之后,没有内存泄漏的话,必然会执行delloc方法。

在我添加了这些移除的方法之后,我发现还是没有执行delloc方法,那是怎么回事儿呢,我一句一句的注释代码,一行代码一行代码运行,结果发现,在使用MJRefresh这个库的时候,产生了内存泄漏
错误代码如下:

MJRefreshNormalHeader * header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        [self refreshAction];
    }];

应该认识到是,这样的代码没有任何崩溃。但是在这个block方法内使用self调用方法,就会产生内存泄漏的问题。

修改代码:

__weak typeof(self) weakSelf = self;
    self.wkweb.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        [weakSelf.wkweb reload];
    }];

就执行了delloc方法了

这里我总结一下:
1、在代码开发过程中,一定要保证每个类在你认为该释放的时候都会执行delloc方法,这样,不会有内存泄漏的情况。如果没有执行delloc,肯定是内存泄露了
2、不管在什么时候,只要是使用block,就使用weakSelf进行弱引用话,这里要注意__weak和__strong的区别,合理使用,千万不要以为没有崩溃,就没有内存泄漏
3、为了避免野指针异常,可以尽量延长对象的生命周期。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存泄漏是指在程序运行过程中,分配的内存空间没有被正确释放,导致内存资源的浪费。对于Keil内存泄漏问题的排查,可以按照以下步骤进行: 1. 检查.leak目录下的.mem文件:根据引用所提供的信息,可以查看.leak目录下是否存在.mem文件。如果存在,可以打开该文件查看具体的内存泄漏信息,以确定是哪个部分的代码存在内存泄漏问题。 2. 检查代码中的宏定义:根据引用所提供的代码片段,可以看到有关内存泄漏的宏定义。在代码中搜索这些宏定义的使用情况,可以找到使用了这些宏定义的地方。进一步分析这些地方的代码逻辑,检查是否存在内存分配后未释放的情况。 3. 使用内存调试工具:Keil提供了一些内存调试工具,可以帮助排查内存泄漏问题。例如,可以使用Keil的内存监视器来跟踪内存的分配和释放情况,以及检测是否存在内存泄漏。 4. 代码审查和调试:仔细审查代码,特别是涉及内存分配和释放的部分。检查是否存在未释放内存的情况,例如忘记调用free()函数或delete操作符。 5. 使用动态内存分析工具:可以使用一些第三方的动态内存分析工具,例如Valgrind等,来检测内存泄漏问题。这些工具可以在程序运行时检测内存分配和释放的情况,并生成相应的报告。 请注意,以上是一些常见的排查内存泄漏问题的方法,具体的排查步骤可能因具体情况而异。在排查过程中,可以结合使用多种方法来定位和解决内存泄漏问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值