美文网首页
ios wkwebview 内存泄漏坑点

ios wkwebview 内存泄漏坑点

作者: Style_mao | 来源:发表于2017-12-26 14:28 被阅读0次

    本文主要解决WKWebView在通过WKUserContentController添加MessageHandler方法用于JS调用Native导致ViewController内存泄露,无法正常释放。

    1.ViewController没有调用dealloc可能的原因

    在使用WKWebView时,ViewController在该释放的时候没有释放(没有调用- (void)dealloc方法)。参考了这篇文章检查了ViewController中的NSTimer、delegate并将所有block中的self更换为weakSelf,结果仍然没有调用dealloc方法。

    之后检查了ViewController中所有使用到self的地方,发现WKUserContentController的下面这个方法有使用到self:

    App注册方法用于JS调用

    - (void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name

    WKWebViewConfiguration *wkConfig = [[WKWebViewConfiguration alloc] init];

    wkConfig.userContentController = [[WKUserContentController alloc] init];

    [wkConfig.userContentController addScriptMessageHandler:self name:@"Native"];

    所以Google了一下该方法是否会引起ViewController不调用dealloc方法。确实是由于该方法引起ViewController内存泄漏。

    搜到的结果

    2. 解决方案

    (1)WeakScriptMessageDelegate

    可以创建一个新的类WeakScriptMessageDelegate,也可以将@interface-@end写在ViewController.h中,@implementation-@end写在ViewController.m中。

    @interface WeakScriptMessageDelegate : NSObject

    @property (nonatomic, weak) id scriptDelegate;

    - (instancetype)initWithDelegate:(id)scriptDelegate;

    @end

    @implementation WeakScriptMessageDelegate

    - (instancetype)initWithDelegate:(id)scriptDelegate {

        self = [super init];

        if (self) {

            _scriptDelegate = scriptDelegate;

        }

        return self;

    }

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

        [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];

    }

    @end

    (2)使用

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

    WKWebViewConfiguration *wkConfig = [[WKWebViewConfiguration alloc] init];

    wkConfig.userContentController = [[WKUserContentController alloc] init];

    [wkConfig.userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"Native"];

    (3)释放WeakScriptMessageDelegate

    - (void)dealloc {

        [self.wkConfig.userContentController removeScriptMessageHandlerForName:@"Native"];

    }

    作者:Jixin

    链接:https://www.jianshu.com/p/1f2dc3d3090a

    來源:简书

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:ios wkwebview 内存泄漏坑点

          本文链接:https://www.haomeiwen.com/subject/rutjgxtx.html