美文网首页iOS开发资料收集区IOS开发者心得
WebView与OC的交互(JSContext循环引用问题)

WebView与OC的交互(JSContext循环引用问题)

作者: AgoniNemo | 来源:发表于2017-01-03 17:57 被阅读1927次

       前些时间,博主遇到了一个需求,就是在网页在UIWebView显示之前传参数给web,就是webView调用OC代码的问题。那个写web页面的兄弟和博主对这个不是很熟悉。然后就是各种google,然后用了网上一个WebViewJavascriptBridge-master的库,然后整个人就开始懵B了。直到一个大神给我一个例子,看到例子以后终于搞定了,现在记录下这个过程。。。

web调OC需要用到JSContext,这个东西是干嘛的呢?以下是苹果给出解释:A JSContextobject represents a JavaScript execution environment. You create and use JavaScript contexts to evaluate JavaScript scripts from Objective-C or Swift code, to access values defined in or calculated in JavaScript, and to make native objects, methods, or functions accessible to JavaScript.我个人的理解就是它是一个web,也就相当于OC里的一个的类吧(不知道理解的对不对)。

它的创建和使用都很简单,就像这样:

JSContext使用(有问题的代码)

我来解释下为什么要把self给context的iOS呢?看到下面的代码你就明白了:

self遵循了代理 协议

当然,这只是OC里写的,下面看看web童鞋要怎么写,看下面:

html代码

看到了吗?这里的iOS对象就相当于ViewContrller,只要是这个ViewController遵循的协议方法,只要OC里实现了,webView都可以调用。

PS:如果在协议加上@optional关键字,web是调用不了这些方法的。

以上代码中,其实有个地方是有问题的,这个问题也是博主后来才发现的,问题的点就是:

这里会把这个类的强引用给context

这就会造成这个self会被强引用,最终会变成循环引用。解决是创建一个中间对象:

JSObject.h JSObject.m

使用时,就这样用:

JSObject使用

最后,这个问题还是没有完全解决,只是通过中间类替换了,这个中间类会被强引用!!!楼主,放弃了这个方法,改用WKWebView,可以点这里查看新的方案,如果还是不明白,那就看Demo吧。

相关文章

网友评论

  • 千若逸:找到一篇文章写了三个解决办法:http://www.jianshu.com/p/939db6215436
    1. 可以使用我参考文章中提到的,注入一个中间的对象去交互,而不是直接使用控制器self。iOS与JS交互实战篇(ObjC版),这样可能需要在对象中在加一层代理,或者Block来进行和控制器之间的通信。
    2. 注入对象改为注入类[self class],这样倒是可以防止内存泄露,但是所写的代理方法就要改为类方法,全部使用类方法在实际开发中会带来一些不便,也不会太好。
    3. 使用Block进行交互替掉JSExport协议。
    可能就第一个方法好用一些

    AgoniNemo:@千若逸 初始化webview后就注册中间类
    千若逸:@AgoniNemo 在web加载完成后添加的我测试了一下是不会有内存泄漏,只不过释放中间类有比较大的延迟,调用dealloc比较慢。你说的弄到web加载完之前是在didCreateJavaScriptContext里操作?
    AgoniNemo:@千若逸 :joy: 第一个方法和我上面说的思路是一样的,但有个问题,就是他是在web加载完成后添加的,而我是要在web加载完成之前把数据传给web端,我特意的去下载了他的demo,发现把他中间类弄到web加载完成之前,他的中间类还是会泄漏。
  • 千若逸:并没有那么麻烦,这样就可以解决了:
    @weakify_self
    {
    @strongify_self
    context[@"iOS"] = self;
    }
    千若逸:@AgoniNemo 午饭前我这样做的发现是没有内存泄漏,现在测试发现又有了,心塞
    AgoniNemo::flushed: 你确定你试过了?
  • 东方龙启:VC虽然可以被释放了,但是创建的JSObject对象没有被释放,JSContext对JSObject对象依然存在引用的
    AgoniNemo::joy: 测试了下JSObject,重写了dealloc方法,还真是没有释放,最近项目忙,没时间搞,兄弟有解决方法吗?

本文标题:WebView与OC的交互(JSContext循环引用问题)

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