上篇博客中介紹了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