上篇博客中介绍了iOS开发中JSPatch引擎进行动态热修复的一些基础功能,其中包括向Objective-C类中添加类方法与成员方法、添加临时成员变量,使用JavaScript调用原生的Objective-C属性和方法等。本篇博客将基于上一篇继续介绍Objective-C中的一些特殊数据类型在JavaScript文件中的使用方法,博客中大部份内容扩展自JSPatch开源git的wiki:https://github.com/bang590/JSPatch。git
iOS中动态更新补丁策略JSPatch运用基础一:http://my.oschina.net/u/2340880/blog/646688。github
在Objective-C代码中,咱们常常会使用到结构体,JSPatch中原生支持的结构体有以下几种:CGPoint,CGSize,CGRect,NSRange。而且这几种结构体在进行界面操做时也会常常使用到。异步
对于CGRect类型,JavaScript使用以下代码建立:async
var view = require('UIView').alloc().init() view.setFrame({x:100,y:100,width:100,height:100})
对于CGPoint类型,JavaScript使用以下代码建立:ide
view.setCenter({x:200,y:200})
对于CGSize类型,JavaScript使用以下代码建立:函数
var size = {width:200,height:200} view.setFrame({x:100,y:100,width:size.width,height:size.height})
对于NSRange类型,JavaScript使用以下代码建立:ui
var range = {location: 0, length: 1}
对于Objective-C中的方法选择器Selector,在JavaScript中使用字符串的形式建立,例如:spa
self.performSelector_withObject("func:", 1)
在JavaScript中,null与undefined都对应于Objective-C中的nil,Objective-C中的NSNull空对象,在JavaScript中使用nsnull来代替。.net
在JavaScript与Objective-C进行block交互有两种方式,一种是在JavaScript文件中调用Objective-C中的block,一种是将JavaScript文件中的函数块做为block参数传递给Objective-C。线程
在JavaScript文件中使用Objective-C中的block十分简单,由于JavaScript中没有block的概念,Objective-C会被自动转换为函数,示例以下:
Objective-C:
typedef void(^block)(NSString * str); @interface ViewController () @end @implementation ViewController -(block)getBlock{ block block = ^(NSString * str){NSLog(@"%@",str);}; return block; } @end
JavaScript:
defineClass("ViewController", { viewDidAppear: function(animated) { var func = self.getBlock() func("123") } })
在JavaScript文件中将func做为参数block传递给Objective-C就复杂一些,须要使用block()方法进行包装,例如:
Objective-C:
@interface ViewController () @end @implementation ViewController -(void)run:(void(^)(NSString * str))block{ block(@"123"); } @end
JavaScript:
defineClass("ViewController", { viewDidAppear: function(animated) { //run 方法中须要传入一个block self.run(block("NSString*",function(str){console.log(str)})) } })
在使用block()方法对JavaScript中的Func进行包装时,block(param1,param2)有两个参数,第1个参数设置func中的参数类型,若是有多个参数,使用逗号分割;第2个参数为func函数体。
注意:在block()包装的func中不可使用self指针,若是须要使用self,须要在block外进行临时变量的转换,示例以下:
defineClass("ViewController", { viewDidAppear: function(animated) { //run 方法中须要传入一个block var slf = self self.run(block("NSString*", function(str){ console.log(str) slf.log(str) })) } })
在JavaScript中分别使用__weak()与__strong来声明弱引用与强引用对象,例如:
var slf = __weak(self) var stgSef = __strong(self)
在JSPatch中,可使用以下JavaScript代码来调用GCD方法:
//阻塞当前线程必定时间 dispatch_after(1.0, function(){ }) //为主线程添加异步任务 dispatch_async_main(function(){ }) //为主线程添加同步任务 dispatch_sync_main(function(){ }) //向全局队列中添加任务 dispatch_async_global_queue(function(){ })
JSPatch中不能够直接使用Objective-C中定义的枚举,可是能够用其枚举的真实值进行传递。例如:
//UIControlEventTouchUpInside的值是1<<6 btn.addTarget_action_forControlEvents(self, "handleBtn", 1<<6);
专一技术,热爱生活,交流技术,也作朋友。
——珲少 QQ群:203317592