WebViewJavaScriptBridge引发的内存泄漏

2021-12-02  本文已影响0人  BabyNeedCare

项目里有个XXWebH5Manager, 也有WebViewController.

已离职的开发同事在viewdidLoad中注入如下代码:

WEAKSELF
 [self.bridge registerHandler:@"XXXX" handler:^(id data, WVJBResponseCallback responseCallback) {
     [XXWebH5Manager sharedWebH5Manager].handle(data, responseCallback, weakSelf);
 }];

最近想要在关闭WebViewController后做一些操作,在dealloc中使用了block回调。结果block在WebViewController消失后,并没有任何响应,断点发现,dealloc没走,这不就内存泄漏了吗?

赶紧排查,原来没调用handerle的移除操作。

那么添加注册和移除注册,就应该换位处理:

-(void)viewWillAppear:(BOOL)animated{
 [super viewWillAppear:animated];

WEAKSELF
 [self.bridge registerHandler:@"XXXX" handler:^(id data, WVJBResponseCallback responseCallback) {
     [XXWebH5Manager sharedWebH5Manager].handle(data, responseCallback, weakSelf);
 }];
}

-(void)viewDidDisappear:(BOOL)animated{
 [super viewDidDisappear:animated];
 [self.bridge removeHandler:@"XXXX"];
}

满心欢喜,以为成功了,结果dealloc还是不走。。。

继续排查, [xxWebH5Manager sharedWebH5Manager].handle(data, responseCallback, self); 有个self, 回调过去指向了WebViewController。

@interface XXWebH5Manager()
@property(nonatomic,strong) WebViewController *webVC;
@end

这就难怪了,这不就构成循环引用了吗?根本释放不了。

把strong改成weak, dealloc()方法就乖乖的运行了!

上一篇 下一篇

猜你喜欢

热点阅读