iOS中動態更新補丁策略JSPatch運用基礎二

iOS中動態更新補丁策略JSPatch運用基礎二

1、引言

    上篇博客中介紹了iOS開發中JSPatch引擎進行動態熱修復的一些基礎功能,其中包括向Objective-C類中添加類方法與成員方法、添加臨時成員變量,使用JavaScript調用原生的Objective-C屬性和方法等。本篇博客將基於上一篇繼續介紹Objective-C中的一些特殊數據類型在JavaScript文件中的使用方法,博客中大部份內容擴展自JSPatch開源git的wiki:https://github.com/bang590/JSPatchgit

iOS中動態更新補丁策略JSPatch運用基礎一:http://my.oschina.net/u/2340880/blog/646688github

2、JavaScript與Objective-C交互的幾種經常使用類型

1.結構體 

    在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}

2.選擇器Selector

    對於Objective-C中的方法選擇器Selector,在JavaScript中使用字符串的形式建立,例如:spa

self.performSelector_withObject("func:", 1)

3.關於空對象

    在JavaScript中,null與undefined都對應於Objective-C中的nil,Objective-C中的NSNull空對象,在JavaScript中使用nsnull來代替。.net

4.在Objective-C與JavaScript中進行block的交互

     在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)

5.關於GCD與枚舉

    在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

相關文章
相關標籤/搜索