一遥倦、簡述
鏈?zhǔn)秸Z法非常吸引人玫鸟,簡潔明了缓熟,我第一眼看到就非常喜歡,也在思考如何在OC中實現(xiàn)鏈?zhǔn)骄幊棠?于是在百度找原理如何在Objective-C中實現(xiàn)鏈?zhǔn)秸Z法走诞? - CocoaChina_讓移動開發(fā)更簡單
在github找到兩個比較全的鏈?zhǔn)綆觳⒀芯苛似饋硪约爸腗asonry副女。
GitHub - Draveness/ChainableKit: Chainable UIKit in Objective-C
一開始我是一個方法一個方法地寫,后面在想姻锁,如果我在category添加了方法枕赵,對應(yīng)的鏈?zhǔn)椒椒斜硪惨砑樱疫@么多方法位隶,也很難寫全拷窜。因此與其自己一個一個寫方法,不如寫好程序讓其自動生成涧黄。這個OC的運(yùn)行時完全可以做到篮昧,把類的方法提取出來,然后生成文件笋妥。
二懊昨、實現(xiàn):
1.參數(shù)的傳遞
由于參數(shù)的數(shù)量是不確定的,為了方便從不定參數(shù)中對出相應(yīng)參數(shù),把所有參數(shù)都封裝成對象,調(diào)用方法時再還原為原來的參數(shù)(封裝成對象使用了Masonry的MASBoxValue以及RAC的宏定義)囚玫。
比如view的hidden灾常,參數(shù)為bool值运敢,則使用宏定義
#define hidden(...) hidden(ml_chain_MASBoxValue(metamacro_at(0, __VA_ARGS__)))
view的frame為結(jié)構(gòu)體,
#define frame(...) frame(ml_chain_MASBoxValue(metamacro_at(0, __VA_ARGS__)))
為了進(jìn)一步便利,結(jié)構(gòu)體會有兩個宏定義
#define frame_(...)? frame(ml_chain_MASBoxValue(CGRectMake(__VA_ARGS__)))
在實際使用時,可以frame(CGRectMake(100, 100, 100, 100)),也可以frame_(100, 100, 100, 100)簿姨,兩者等效
2.方法的提取規(guī)則
只提取返回值為void的實例方法
3.方法的調(diào)用
先根據(jù)self和SEL得出methodSignature,由于之前把所以參數(shù)都封裝成對象簸搞,如果實際參數(shù)不是對象的話扁位,把參數(shù)還原成本來的值,并用NSInvocation一一代入趁俊。
三贤牛、鏈?zhǔn)秸Z法生成器的使用
1.前往GitHub - luomagaoshou/MLChain下載(pods還沒有審核通過,所以要手動下載)
2.將Category文件夾與ChainHelper文件夾拖入項目
3.導(dǎo)入 #import "NSObject+ChainFileCreater.h"
4.調(diào)用方法则酝,把要生成的類放入數(shù)組中,如[NSObject ml_chainCreateChainFileWithClassNames:@[[UITableView class], [CALayer class], [CABasicAnimation class], [UIButton class]]]; ?此方法用于生成文件,生成一次即可沽讹。
5.運(yùn)行代碼般卑,桌面會多了個MLChain的文件夾,再把文件夾拖到項目(里面的文件就是鏈?zhǔn)椒椒?爽雄,并在需要用的時候?qū)?import "MLChain.h"蝠检。
注意點:(1).如果有方法重名需要手動刪除
(2).不管是私有方法還是公有方法都會生成,使用需要注意
四挚瘟、代碼示例
UIView *view1 = [[UIView alloc] init];
//創(chuàng)建實例后調(diào)用
view1.ml_make.backgroundColor([UIColor orangeColor]).
frame(CGRectMake(50, 100, 100, 100));
[self.view addSubview:view1];
//使用frame_叹谁,有時候比較方便
UIView *view2 = UIView.ml_make.backgroundColor([UIColor greenColor]).frame_(50, 220, 100, 100).view;
[self.view addSubview:view2];
//使用類方法進(jìn)行設(shè)置,需要注意的是使用類方法ml_make是沒有代碼提示的乘盖,不是很方便的一點
UIView.ml_make.backgroundColor([UIColor grayColor]).
frame_(50, 340, 100, 100).
moveToSuperview(self.view);
效果圖如下
五焰檩、優(yōu)缺點
(一)優(yōu)點:1.所有的方法都來自系統(tǒng)或者自己寫的方法,上手快
2.使用中間量作為橋梁賦值订框,侵入性低析苫,不影響原有類
(二)缺點:1.由于使用invocation替代直接調(diào)用方法,調(diào)試起來難度增加不少
2.block的返回值使用instancetype沒有點語法穿扳,若指針類型上移衩侥,需要用lookupMakerOfXXX找回來
3.私有方法沒有完全過濾,容易誤用錯用
4.在較底層的類如QuartzCore框架矛物, 有許多Ref類型茫死,如果沒有逐一寫好轉(zhuǎn)換方法,賦值時會造成無效或崩潰
?此處應(yīng)有demo?GitHub - luomagaoshou/MLChainDemo