关于iOS7里的JavaScriptCore framework

本文详细介绍了iOS7中JavaScriptCore框架的功能和使用方法,包括Objective-C与JavaScript的互相调用、内存管理、线程封装等内容,并探讨了该框架在实际应用中的优势。

iOS7沸沸扬扬的扁平化论战之外,WWDC 2013还是公布了很多让开发者小兴奋的点,其中包括多任务加强支持background fetchtransfer,近场通信的AirDropp2p,以及游戏控制器和游戏中心的加强;当然还包括了让web开发同学很兴奋JavaScriptCore了。下面henry/webryan来详细介绍下整合JavaScriptCore到原生应用的情况。

102713_1406_iOS7JavaScr1.png

1、什么是JavaScriptCore

前端开发的同学应该知道,浏览器核心模块主要是渲染引擎和JavaScript引擎两部分组成。前者用于处理页面布局,渲染及DOM结构等,后者用于JavaScript的解析、执行及DOM交互等。

JavaScriptCore是一种JavaScript引擎,主要为webkit提供脚本处理能力(其主要以safari浏览器为代表)。除此之外,市面上还有注明的JscriptIE, SpiderMonkeyfirefox)和V8chrome)。JavaScriptCore是开源webkit的一部分,它提供了强大的整合能力,有兴趣的同学可以到官网下载编译和测试(http://www.webkit.org/projects/javascript/

102713_1406_iOS7JavaScr2.png

2、为什么苹果要在native应用中(非webview)引入JavaScript

首先,脱离了浏览器外壳和繁重的UI布局和渲染的JavaScript引擎,无疑可以将JavaScript的能力更轻便地、高性能地带给原生的iOS应用,给应用开发者提供更多的想象力(无论是PC还是移动的浏览器,UIGUI部分都是最重要的性能瓶颈和优化点)。

其次,在移动开发场景中确实有众多的开发者对JavaScript有需求。在google上搜索”embed javascript engine ios”可以得到大量的实践和博文。

再次,苹果已经在mac上得到很不错的实践和反响。引入JavaScriptCore即扩大了SDK能力又讨好了开发者,何乐不为呢。

102713_1406_iOS7JavaScr3.png

3、引入JavaScriptCore到底包括了哪些能力呢?

aObjective-C –> JavaScript (即在Objective-C语言环境里执行JavaScript代码段,创建JavaScript变量及变量操作等等)

bJavaScript –> Objective-C(即在JavaScript语言环境里调用Objective-C公开给JavaScript的方法)

c、内存管理和线程封装(主要是需要注意引用和线程使用冲突)

4、代码层具体应该怎么使用呢?

a、执行JavaScript代码的方法:首先引入JavaScriptCore.h,然后通过JSContext创建JS运行环境,再通过evaluateScript来执行结果;

102713_1406_iOS7JavaScr4.png

最后要访问执行结果的话,需要注意数据类型的转换,Objective-CJS的对应关系主要如下:

– (BOOL)toBool;

– (double)toDouble;

– (int32_t)toInt32;

– (uint32_t)toUInt32;

– (NSNumber *)toNumber;

– (NSString *)toString;

– (NSDate *)toDate;

– (NSArray *)toArray;

– (NSDictionary *)toDictionary;

– (id)toObject;

– (id)toObjectOfClass:(Class)expectedClass;

b、调用JS的函数:通过evaluateScript将脚本片段引入到上下文,然后通过callWithArguments进行调用。

102713_1406_iOS7JavaScr5.png

c、通过JS调用Objective-C的方法1–Blocks(即function方式)

通过在Objective-CJS context直接定义函数,那么在JS语言环境里可以直接使用 makeNSColor函数。

102713_1406_iOS7JavaScr6.png

d、通过JS调用Objective-C的方法2–JSExport(即object方式)

通过在Objective-C中声明JSExport的数据类型,可以直接在JS的语言环境里当作全局变量使用。

102713_1406_iOS7JavaScr7.png

创建MyPoint类,MyPoint类实现MyPointExports协议,然后将MyPoint类的实例注入JS。

示例:

MyPoint *point = [[MyPoint alloc] init];

context[@"point"] = point;

e、扩展系统已有类到JS

比如将Label的一个实例导出到JS,让JS设置Label的text属性。

(1)首先实现一个协议,将text属性Export:

         @protocol MyLabelExportProtocol <JSExport>


         @property(nonatomic,copy)NSString *text;


         @end

         (2)将此协议动态添加到UILabel的Class上:

         class_addProtocol([UILabelclass], @protocol(MyLabelExportProtocol));

         (3)将UILabel的一个实例添加至JS上下文:

         [contextsetObject:label forKeyedSubscript:@"label"];


         (4)在JS中就可以通过text属性设置label的显示值了:

         label.text = 'Label显示值';

OK相信看到这,你已经知道该怎么实现Objective-CJavaScript的相互调用了。其实这里和在浏览器中的相互操作是类似的。那么使用过过程中也要注意引用的回收和避免循环引用等问题,否则会导致内存泄露,甚至程序崩溃。这里我就不赘述了。

102713_1406_iOS7JavaScr8.png

5、JavaScriptCore怎么和UIWebView连接起来呢?

 JSContext *context = [webviewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

6、JavaScriptCore可以带来了哪些实战应用呢?

1、对于类Titanium的应用绝对是一大利好。Titanium就是通过内置JavaScript引擎操作Objective-C提供的能力,以达到通过JavaScript来开发相对高性能的应用(对比phonegap而言)。内置JavaScriptCore可以使类Titanium框架体积得到明显减小。

102713_1406_iOS7JavaScr9.png

2、对于动态更新类需求是非常有帮助的。JavaScript文件对于iOS7+的应用,相当于LuaCocos2d-x的意义,即提供一种动态局部升级和更新的逻辑,大大提高应用的可扩展性。

3、对手机内嵌web模式的新尝试点,即通过native+JS file的方式取代webview的方式。比如群创建页面,通过手Q提供基础的组件能力,通过加载JS文件来渲染生成创建群UI,并且通过HTTPTCP方式更新create.js,即可实现更贴近原生的交互体验和web的灵活性。

转自:http://www.webryan.net/2013/10/about-ios7-javascriptcore-framework/,部分内容有更改,内容有增加。
### 光流法C++源代码解析与应用 #### 光流法原理 光流法是一种在计算机视觉领域中用于追踪视频序列中运动物体的方法。它基于亮度不变性假设,即场景中的点在时间上保持相同的灰度值,从而通过分析连续帧之间的像素变化来估计运动方向和速度。在数学上,光流场可以表示为像素位置和时间的一阶导数,即Ex、Ey(空间梯度)和Et(时间梯度),它们共同构成光流方程的基础。 #### C++实现细节 在给定的C++源代码片段中,`calculate`函数负责计算光流场。该函数接收一个图像缓冲区`buf`作为输入,并初始化了几个关键变量:`Ex`、`Ey`和`Et`分别代表沿x轴、y轴和时间轴的像素强度变化;`gray1`和`gray2`用于存储当前帧和前一帧的平均灰度值;`u`则表示计算出的光流矢量大小。 #### 图像处理流程 1. **初始化和预处理**:`memset`函数被用来清零`opticalflow`数组,它将保存计算出的光流数据。同时,`output`数组被填充为白色,这通常用于可视化结果。 2. **灰度计算**:对每一像素点进行处理,计算其灰度值。这采用的是RGB通道平均值的计算方法,将每个像素的R、G、B值相加后除以3,得到一个近似灰度值。此步骤确保了计算过程的鲁棒性和效率。 3. **光流向量计算**:通过比较当前帧和前一帧的灰度值,计算出每个像素点的Ex、Ey和Et值。这值得注意的是,光流向量的大小`u`是通过`Et`除以`sqrt(Ex^2 + Ey^2)`得到的,再乘以10进行量化处理,以减少计算复杂度。 4. **结果存储与阈值处理**:计算出的光流值被存储在`opticalflow`数组中。如果`u`的绝对值超过10,则认为该点存在显著运动,因此在`output`数组中将对应位置标记为黑色,形成运动区域的可视化效果。 5. **状态更新**:通过`memcpy`函数将当前帧复制到`prevframe`中,为下一次迭代做准备。 #### 扩展应用:Lukas-Kanade算法 除了上述基础的光流计算外,代码还提到了Lukas-Kanade算法的应用。这是一种更高级的光流计算方法,能够提供更精确的运动估计。在`ImgOpticalFlow`函数中,通过调用`cvCalcOpticalFlowLK`函数实现了这一算法,该函数接受前一帧和当前帧的灰度图,以及窗口大小等参数,返回像素级别的光流场信息。 在实际应用中,光流法常用于目标跟踪、运动检测、视频压缩等领域。通过深入理解和优化光流算法,可以进一步提升视频分析的准确性和实时性能。 光流法及其C++实现是计算机视觉领域的一个重要组成部分,通过对连续帧间像素变化的精细分析,能够有效捕捉和理解动态场景中的运动信息
微信小程序作为腾讯推出的一种轻型应用形式,因其便捷性与高效性,已广泛应用于日常生活中。以下为该平台的主要特性及配套资源说明: 特性方面: 操作便捷,即开即用:用户通过微信内搜索或扫描二维码即可直接使用,无需额外下载安装,减少了对手机存储空间的占用,也简化了使用流程。 多端兼容,统一开发:该平台支持在多种操作系统与设备上运行,开发者无需针对不同平台进行重复适配,可在一个统一的环境中完成开发工作。 功能丰富,接口完善:平台提供了多样化的API接口,便于开发者实现如支付功能、用户身份验证及消息通知等多样化需求。 社交整合,传播高效:小程序深度嵌入微信生态,能有效利用社交关系链,促进用户之间的互动与传播。 开发成本低,周期短:相比传统应用程序,小程序的开发投入更少,开发周期更短,有助于企业快速实现产品上线。 资源内容: “微信小程序-项目源码-原生开发框架-含效果截图示例”这一资料包,提供了完整的项目源码,并基于原生开发方式构建,确保了代码的稳定性与可维护性。内容涵盖项目结构、页面设计、功能模块等关键部分,配有详细说明与注释,便于使用者迅速理解并掌握开发方法。此外,还附有多个实际运行效果的截图,帮助用户直观了解功能实现情况,评估其在实际应用中的表现与价值。该资源适用于前端开发人员、技术爱好者及希望拓展业务的机构,具有较高的参考与使用价值。欢迎查阅,助力小程序开发实践。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值