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()方法就乖乖的运行了!