昨天写好的一个功能是有关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、为了避免野指针异常,可以尽量延长对象的生命周期。