JavaScriptCore(2)
来源:互联网 发布:fzltchjw gb1 0 mac 编辑:程序博客网 时间:2024/05/01 23:56
异常处理
Objective-C的异常会在运行时被Xcode捕获,而在JSContext
中执行的JavaScript如果出现异常,只会被JSContext
捕获并存储在exception
属性上,而不会向外抛出。时时刻刻检查JSContext
对象的exception
是否不为nil
显然是不合适,更合理的方式是给JSContext
对象设置exceptionHandler
,它接受的是^(JSContext *context, JSValue *exceptionValue)
形式的Block。其默认值就是将传入的exceptionValue
赋给传入的context
的exception
属性:
1 ^(JSContext *context, JSValue *exceptionValue) {2 context.exception = exceptionValue;3 };
我们也可以给exceptionHandler
赋予新的Block以便在JavaScript运行发生异常的时候我们可以立即知道:
1 JSContext *context = [[JSContext alloc] init]; 2 context.exceptionHandler = ^(JSContext *con, JSValue *exception) { 3 NSLog(@"%@", exception); 4 con.exception = exception; 5 }; 6 7 [context evaluateScript:@"ider.zheng = 21"]; 8 9 //Output:10 // ReferenceError: Can't find variable: ider
使用Block的注意事项
从之前的例子和介绍应该有体会到Block在JavaScriptCore中起到的强大作用,它在JavaScript和Objective-C之间的转换 建立起更多的桥梁,让互通更方便。但是要注意的是无论是把Block传给JSContext
对象让其变成JavaScript方法,还是把它赋给exceptionHandler
属性,在Block内都不要直接使用其外部定义的JSContext
对象或者JSValue
,应该将其当做参数传入到Block中,或者通过JSContext
的类方法+ (JSContext *)currentContext;
来获得。否则会造成循环引用使得内存无法被正确释放。
比如上边自定义异常处理方法,就是赋给传入
JSContext
对象con
,而不是其外创建的context
对象,虽然它们其实是同一个对象。这是因为Block会对内部使用的在外部定义创建的对象做强引用,而JSContext
也会对被赋予的Block做强引用,这样它们之间就形成了循环引用(Circular Reference)使得内存无法正常释放。对于
JSValue
也不能直接从外部引用到Block中,因为每个JSValue
上都有JSContext
的引用 (@property(readonly, retain) JSContext *context;
),JSContext
再引用Block同样也会形成引用循环。 0 0
- JavaScriptCore(2)
- javascriptcore
- JavaScriptCore
- JavaScriptCore
- JavaScriptCore
- JavaScriptCore学习之JavaScriptCore
- iOS js oc相互调用(JavaScriptCore 2)
- 移植JavaScriptCore
- JavaScriptCore-SquirrelFish
- JavaScriptCore解析
- JavaScriptCore框架
- JavaScriptCore 使用
- JavaScriptCore 简介
- JavaScriptCore (一)
- JavaScriptCore使用
- JavaScriptCore 使用
- JavaScriptCore 使用
- JavaScriptCore(1)
- JavaScriptCore(1)
- poj1726 Tango Tango Insurrection
- 荷兰国旗问题(改造快速排序)
- 求两个数a和b的最大公约数
- HelloCharts重新绘图时旧数据残留问题
- JavaScriptCore(2)
- Mxnet学习系列2----如何制作image.rec(新版本)
- LeetCode 84 Largest Rectangle in Histogram
- tomcat集群配置
- EL 表单打印输出
- 关于数据库ceil()函数,floor()函数,round()函数和trunc()函数
- 配置linux服务器做简单的路由器
- 新人学习Struts2笔记(1)
- 在Unity3D里使用DLL