參考來自:http://www.reibang.com/p/8cec322531ae
JSPatch,也許也有很多人覺得這是個(gè)很高大上的技術(shù)嗜桌,其實(shí)不然纲酗,我們只需要在項(xiàng)目里引入極小的引擎文件嵌屎,就可以使用 JavaScript 調(diào)用任何 Objective-C 的原生接口,替換任意 Objective-C 原生方法训柴。當(dāng)然呢,目前主要用于下發(fā) JS 腳本替換原生 Objective-C 代碼妇拯,實(shí)時(shí)修復(fù)線上 bug幻馁。
JSPatch的代碼大家可以去github 上面下載
首先說一下JsPatch實(shí)現(xiàn)的內(nèi)部原理:JsPatch能做到通過JS調(diào)用和改寫OC方法最根本的原因是 Objective-C 是動(dòng)態(tài)語言洗鸵,OC上所有方法的調(diào)用/類的生成都通過 Objective-C Runtime 在運(yùn)行時(shí)進(jìn)行,我們可以通過類名和方法名反射得到相應(yīng)的類和方法仗嗦,也可以替換某個(gè)類的方法為新的實(shí)現(xiàn)膘滨,還可以新注冊(cè)一個(gè)類,為類添加方法稀拐。這里就不詳細(xì)介紹runtime了火邓,相關(guān)的資料我會(huì)在后續(xù)的博客里介紹,大家再等等吧德撬。所以 JSPatch 的原理就是:JS傳遞字符串給OC铲咨,OC通過 Runtime 接口調(diào)用和替換OC方法。這個(gè)很容易理解蜓洪,JS的作用只是一個(gè)信使的作用纤勒,具體實(shí)現(xiàn)還是得靠我們OC,所以說OC還是世界上最美的語言,哈哈隆檀。
同時(shí)在這里給大家一個(gè)比較好的網(wǎng)站 點(diǎn)這里.這是一個(gè)OC轉(zhuǎn)JS的一個(gè)工具網(wǎng)站摇天。
下面給大家演示一下具體實(shí)現(xiàn)的步驟
- (void)viewDidLoad
{
UITableView* tv = [[UITableView alloc]initWithFrame:self.view.bounds
style:UITableViewStylePlain];
self.mqTableView = tv;
self.mqTableView.delegate = self;
self.mqTableView.dataSource = self;
[self.view addSubview:self.mqTableView];
}
#pragma mark -- UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* i= @"cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:i];
if (cell == nil ) {
cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:i];
}
cell.textLabel.text = @"meiqing";
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.dataSource = @[@"1",@"2"];
// 肯定會(huì)超出數(shù)組范圍導(dǎo)致 crash
NSString *content = self.dataSource[indexPath.row];
}
顯示的結(jié)果是這樣的
屏幕快照 2015-12-10 上午12.09.15.png
上面的圖片是沒有修改時(shí)候的顯示,當(dāng)我點(diǎn)擊第三行一定會(huì)閃退恐仑,怎么修復(fù)呢闸翅?這個(gè)時(shí)候就不用發(fā)版本了,服務(wù)器可以給我們傳送一個(gè)js文件菊霜,文件里的內(nèi)容是這樣的
屏幕快照 2015-12-10 上午12.44.14.png
同時(shí)坚冀,我們?cè)贏PPDelegate里調(diào)用這個(gè)JS就可以了,如下:
屏幕快照 2015-12-10 上午12.45.25.png
再次運(yùn)行就不會(huì)出現(xiàn)閃退了鉴逞。整個(gè)流程下來其實(shí)挺簡單的记某,希望大家能夠接受,如果喜歡我的文章构捡,可以關(guān)注我后續(xù)的文章液南。
附帶github demo