IOS7--javascriptcore中jscontext使用要注意的一点

在公司一个项目中,用到了highchart做图表显示的组件,这就要用到了javascriptcore,代码就不上了,说说原理。

需求是这样的,通过http请求server csv格式的数据,然后解析,最后传入LOCAL的html 中用highchart显示出来。

由于需要显示loading,progress等,所以就用了IOS提供的原生NSURLConnection,实现 NSURLConnectionDelegateNSURLConnectionDataDelegate .

原先的设计是这样的,在controller view实现 <UIWebViewDelegate> ,在viewDidLoad 中加载本地的html文件(这个就是显示chart的html,里面配置好chart所需要的一切,只等OC传数据进来),在 - webViewDidFinishLoad: 中初始化JSContext并开始连接请求.  在 - connectionDidFinishLoading:  把数据痛过[JSContext[@"value" callWithArguments:] ]传给对用的js method。

这样做,Chart偶尔能出来,更多时候throw exception。exception有两个,一是: exc_bad_access code=1 address=**** 另一个是: exc_breakpoint (code=exc_i386_bpt subcode=0x0) . 

开始怀疑是数据的问题,就把网络请求到的数据储存到本地,然后在- webViewDidFinishLoad: 通过JSContext传给js,结果完全没有问题,chart每次显示完美。

通过搜索,在stackoverflow中了解到报错:exc_bad_access code=1 address=**** 的原因是,使用了已经release的object。通过Debug,跟踪到出问题时候是在调用js method的时候。因为项目用的是ARC,而我们的服务器是放在AWS上面的,并且注册的region是Ireland,服务器响应时间一般在2~5s,(比较慢,因为后台需要计算),我想,是不是在等待的这段时间,OC已经把我的JSContext release了,因为我是在 - webViewDidFinishLoad:  中初始化JSContext对象并开始请求数据的,也就是说,JSContext对象至少闲置了2~5s的时间。

开始修改代码,在 viewdidload 中首先开始请求数据,等请求完成后在开始load local html,然后在- webViewDidFinishLoad: 再初始化JSContext,并把数据传过去[JSContext[@"value" callWithArguments:] ] ,run ... 一切没问题。

ARC的确是方便了我们很多,也许我们在享受它带来好处的同时也要警惕它最大的好处。

时间: 2024-10-09 11:16:24

IOS7--javascriptcore中jscontext使用要注意的一点的相关文章

ios7 JavaScriptCore.framework

以前想要oc调用js代码一般是通过uiwebview的stringByEvaluatingJavaScriptFromString方法,或是直接使用JavaScriptCore引擎,例如https://github.com/jfahrenkrug/AddressBookSpy. 但是,Apple正式发布了新的iOS 7系统,引入了JavaScriptCore.framework  ,最大最直观的改变在于界面变得小清新范了,我也提到<iOS,你真的越来越像Android了>.不过对于移动开发者来

使用SWTableViewCell获得ios7邮件中cell的右推出现选项的效果

SWTableViewCell 是托管在GitHub上的一个第三方UITableViewCell子类,它提供向左向右滑动出现“删除”,“更多”等自定义UIButton的功能,该功能类似于iOS7中的邮件中的Cell.GitHub主页: https://github.com/CEWendel/SWTableViewCell Example: 场景:假如我现在要做一个TableView,它的cell就是SWTableViewCell的效果. ViewController.h #import <UIK

在ios7开发中遇到的一些deprecated的问题

cell.textLabel.textAlignment = UITextAlignmentCenter; 现在要写成cell.textLabel.textAlignment =NSTextAlignmentCenter; UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:nil] autorelease]; 需要写成 static NSString *TableS

Launch Screen在iOS7/8中的实现

Launch Screen在iOS7/8中的实现 目前项目中需要解决的问题是: 兼容iOS7和iOS8,之前的版本不需要支持了 实现兼容3.5.4.4.7和5.5寸屏幕,竖屏的Lauch Screen 创建所需的PNG图片 有关iPhone6/6+相关尺寸见这里 需要如下尺寸图片: 用于iPhone6+的1242x2208,或者1080x1920,也就是Retina HD 5.5 用于iPhone6的750x1334,也就是Retina HD 4.7 用于4寸屏(iPhone5/5s)的640x

xCode5 在ios7模拟器中出现__cxa_throw _pthread_exit错误

xCode5 在ios7模拟器中出现__cxa_throw _pthread_exit错误 2013年10月28日 ⁄ 综合 ⁄ 共 233字 ⁄ 字号 小 中 大 ⁄ 评论关闭 在项目中用模拟器中进行音频录音方面的调试,碰到一个莫名的问题,就是在ios6的模拟器中运行没问题,但是在ios7的模拟下出以下错误提示: 看了半天,没发现程序代码有什么错误,但在在移除所有断点后,程序在ios7模拟器下运行正常了.原来是在调试时加了“All Exceptions” Breakpoint, 移除后一切正常

C#中使用ref 和 out 的一点认识

ref 通常我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响. 这种情况是通常的,当然还有另外一种情况,我们向方法传递参数的形式,引用(ref)和输出(out). 有时,我们需要改变原来变量中的值,这是我们可以向方法传递变量引用,而不是变量的值,引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置,当引用被修改时,修改的是内存中的值,因

iOS7.0中UILabel高度调整注意事项

转自:http://blog.csdn.net/k12104/article/details/33731833 http://herkuang.info/blog/2013/12/31/ios7%E4%B8%ADuilabel%E9%AB%98%E5%BA%A6%E8%B0%83%E6%95%B4%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/ 我的“记词助手”在升级到iOS7之后,一直出现UILabel错位的问题: 我的label是用- (CGSize)sizeWit

iOS 8:【转】Launch Screen在iOS7/8中的实现

源地址:http://blog.shiqichan.com/Launch-Screen-in-iOS-7-and-8/ 目前项目中需要解决的问题是: 兼容iOS7和iOS8,之前的版本不需要支持了 实现兼容3.5.4.4.7和5.5寸屏幕,竖屏的Lauch Screen 创建所需的PNG图片 有关iPhone6/6+相关尺寸见这里 需要如下尺寸图片: 用于iPhone6+的1242x2208,或者1080x1920,也就是Retina HD 5.5 用于iPhone6的750x1334,也就是R

关于ios7 navigationController中view的frame以及坐标点

今天做项目发现一个奇怪的问题: 在ios7下, navigationController的viewframe为 {{0, 0}, {320, 568}} 导航不占位置了,这个清楚. 但是为毛view上面的子视图的y坐标计算是从64开始的呢? 譬如我设一个子视图的y坐标为0,它是从导航栏下面开始加载. 这就表示导航栏占了这个view的位置啊. 继续看: 发现,ios7下view的高度为568 屏幕大小为568: 但是:view的起始y坐标是64.坑爹啊.这样的话view会有一部分在窗口外,显示不完