WebViewJavascriptBridge对象销毁

WebViewJavascriptBridge对象销毁

在项目中,为了与js交互,页面A引用了WebViewJavascriptBridge框架创建了WebViewJavascriptBridge对象,没有测试页面A退出时,页面A是否销毁。近日,页面A播放了一段音乐,发现在退出页面A后,音乐仍在播放中,没法关闭,只有kill掉app。
查找后发现,WebViewJavascriptBridge部分源码如下

@implementation WKWebViewJavascriptBridge {
WKWebView* _webView;
id<WKNavigationDelegate> _webViewDelegate;
long _uniqueId;
WebViewJavascriptBridgeBase *_base;
}
- (void)setWebViewDelegate:(id<WKNavigationDelegate>)webViewDelegate {
_webViewDelegate = webViewDelegate;
}

需要在 -(void)viewWillDisappear:(BOOL)animated- (void)viewDidDisappear:(BOOL)animated 中设置setWebViewDelegate为nil,页面A才会销毁。

项目中导入了JAPatch,main.js中相关代码如下:

viewWillDisappear: function(animated) {
self.super().viewWillDisappear(animated);
self.bridge().setWebViewDelegate(null);
},

执行后发现页面A销毁了,但相应的WebViewJavascriptBridge对象没有销毁,音乐播放仍在继续中。 想起在JSPatch文档-内存释放问题中看到的

如果一个 OC 对象被 JS 引用,或者在 JS 创建这个对象,这个 OC 对象在退出作用域后不会马上释放,而是会等到 JS 垃圾回收时才释放,这会导致一些 OC 对象延迟释放,
没有被 JS 引用过的 OC 对象不受影响。

经过测试发现,在页面A销毁后,一分钟左右时间之后,相应的WebViewJavascriptBridge对象会销毁(dealloc会调用),音乐播放停止。怎么在JS中部引用WebViewJavascriptBridge对象呢?KVC。代码如下:

viewWillDisappear: function(animated) {
self.super().viewWillDisappear(animated);
//delegate是强引用
self.setValue_forKeyPath(null, "bridge.webViewDelegate");
},

经过测试,没有问题,完美!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Web 页面中的 JS 与 iOS Native 如何交互是每个 iOS 猿必须掌握的技能。而说到 Nati...
    幽城88阅读 2,265评论 1 8
  • WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前...
    咖啡绿茶1991阅读 1,039评论 0 5
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    iOS菜鸟大大阅读 763评论 0 1
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 4,224评论 2 19
  • 新年啦,新的一年到来啦,今天家家户户团圆的时刻,不管上一年是过得得意还是过得失意,过去的已经过去,新的一年开始,祝...
    奶思酱阅读 95评论 0 1